trang chủ / bài tập / balsubsets / lời giải

Tập Con Cân Bằng

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Tác giả: huunguyenhuunguyen

Lời giải: Tập con cân bằng

Hướng tiếp cận

Bài toán yêu cầu đếm số tập con thỏa mãn 4 điều kiện. Ta sẽ phân tích cấu trúc của tập con hợp lệ rồi dùng quy hoạch động.

Nhận xét quan trọng

Nhận xét 1: Trong mỗi hàng có ít nhất một ô thuộc tập con, tập hợp các ô đó phải tạo thành một đoạn liên tục [Li,Ri] (từ điều kiện 3 và 4).

Nhận xét 2: Các hàng chứa ô thuộc tập con phải là liên tiếp nhau (từ điều kiện 2 - liên thông 4 chiều).

Nhận xét 3: Hai hàng liên tiếp ii+1 phải có đoạn giao nhau: Li+1RiRi+1Li.

Nhận xét 4 (quan trọng nhất): Dãy L1,L2,,Lk phải là dãy lưỡng điệu giảm rồi tăng (non-increasing rồi non-decreasing). Tương tự, dãy R1,R2,,Rk phải là dãy lưỡng điệu tăng rồi giảm.

Chứng minh nhận xét 4: Nếu L có dạng tăng-giảm-tăng (không đơn điệu 2 pha), thì tồn tại i<j<k sao cho Li<LjLj>Lk. Từ điều kiện 3, cột Lj xuất hiện ở hàng j nhưng không xuất hiện ở hàng i hay k. Tuy nhiên để liên thông, phải có đường đi từ một ô ở hàng i qua hàng j đến hàng k, mà đường đi đó khi đi qua cột Lj sẽ tạo ra các ô ở cột Lj ở tất cả các hàng giữa — mâu thuẫn. Lập luận tương tự cho R.

Thuật toán

Trạng thái DP: dp[a][b][l][r] = số tập con cân bằng có hàng đáy là hàng hiện tại h, đoạn cột của hàng đáy là [l,r], trong đó:

  • a=0: dãy L vẫn đang trong pha không tăng; a=1: dãy L đã chuyển sang pha không giảm
  • b=0: dãy R vẫn đang trong pha không giảm; b=1: dãy R đã chuyển sang pha không tăng

Chuyển trạng thái: Từ hàng h1 sang hàng h, nếu hàng trước có đoạn [l,r] và hàng hiện tại có đoạn [l,r]:

Từ (a,b) Sang (a,b) Điều kiện
(0,0) (0,0) ll, rr
(0,0) (0,1) l[l,r], r>r
(0,0) (1,0) l<l, r[l,r]
(0,0) (1,1) l<l, r>r
(0,1) (0,1) l[l,r], rr
(0,1) (1,1) l<l, rr
(1,0) (1,0) ll, r[l,r]
(1,0) (1,1) ll, r>r
(1,1) (1,1) ll, rr

Tối ưu hoá: Mỗi truy vấn chuyển trạng thái là tổng một vùng chữ nhật trên mảng dp[a][b]. Ta dùng 4 loại bảng prefix sum (suffix-L prefix-R, suffix-L suffix-R, prefix-L prefix-R, prefix-L suffix-R) để trả lời mỗi truy vấn trong O(1). Tổng độ phức tạp là O(N3).

Mỗi hàng h: xây dựng bảng prefix sum O(N2), rồi duyệt tất cả (l,r) hợp lệ O(N2) với chuyển trạng thái O(1) → tổng O(N3).

Độ phức tạp

  • Thời gian: O(N3)
  • Bộ nhớ: O(N2) cho bảng DP và prefix sum

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0