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

Hoàng Tử Lai

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

Hướng tiếp cận

Với N36, duyệt tất cả 2366.9×1010 tập con là quá chậm. Ta sử dụng kỹ thuật Meet-in-the-Middle: chia N nguyên liệu thành hai nửa, duyệt 2N/2 tập con mỗi nửa, rồi kết hợp kết quả bằng bảng băm.

Nhận xét quan trọng

  1. Chia N nguyên liệu thành nửa trái (N/2) và nửa phải (NN/2). Mỗi nửa có tối đa 218=262144 tập con — hoàn toàn khả thi.

  2. Với mỗi tập con của nửa trái, ta tính cặp (sa,sb) là tổng độ chua và tổng độ đắng. Lưu vào bảng băm: (sa,sb) số lượng.

  3. Với mỗi tập con của nửa phải có tổng (sa,sb), ta cần tìm trong nửa trái các tập con có tổng (Asa,Bsb).

  4. Cần dùng cả hai tính chất (a,b) làm khóa. Nếu chỉ dùng một tính chất sẽ đếm thừa.

Thuật toán

  1. Chia đôi: Nửa trái gồm nguyên liệu 0,1,,N/21. Nửa phải gồm nguyên liệu N/2,,N1.

  2. Duyệt nửa trái: Với mỗi bitmask 0mask<2N/2:

    • Tính (sa,sb) = tổng (ai,bi) của các nguyên liệu trong mask
    • Thêm vào bảng băm: map[(s_a, s_b)]++
  3. Duyệt nửa phải và kết hợp: Với mỗi bitmask 0mask<2NN/2:

    • Tính (sa,sb) = tổng của các nguyên liệu trong mask
    • Tra bảng băm: ans += map[(A - s'_a, B - s'_b)]
  4. Kết quả: In ans.

Độ phức tạp

  • Thời gian: O(2N/2·N) — duyệt 2N/2 tập con mỗi nửa, mỗi tập con tốn O(N/2) để tính tổng. Với N=36: 2×218×18107.
  • Bộ nhớ: O(2N/2) — lưu bảng băm cho nửa trái.

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