Editorial for XOR2SEQ - Phép XOR


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Nguồn bài tập: AtCoder Regular Contest 092 - Problem B https://atcoder.jp/contests/arc092/tasks/arc092_b

Với mỗi ~k~ từ ~0~ đến ~20~, ta cần xác định xem bit thứ ~k~ của tổng ~XOR~ cần tìm là ~0~ hay ~1~ (nếu bit ~k~ là ~1~, ta sẽ cộng thêm ~2^k~ vào đáp án). Ta cần đếm số cặp ~(i,j)~ sao cho bit thứ ~k~ của ~a_i + b_j~ bằng ~1~. Nếu số cặp là chẵn thì bit thứ ~k~ của tổng ~XOR~ bằng ~0~, ngược lại thì bit thứ ~k~ của tổng ~XOR~ bằng ~1~.

Để thực hiện điều này, gọi ~T = 2^k~. Ta nhận xét rằng, ta chỉ cần quan tâm đến ~k + 1~ bit cuối của mỗi ~a_i~ và ~b_i~. Nói cách khác, ta chỉ cần quan tâm đến các giá trị ~a_i~ và ~b_i~ sau khi chua lấy dư cho ~2T~.

Ta nhận xét rằng, để bit thứ ~k~ của ~a_i + b_j~ bằng ~1~ thì giá trị ~a_i + b_j~ phải thỏa một trong hai điều kiện sau:

  • ~T ≤ a_i + b_j < 2T~
  • ~3T ≤ a_i + b_j < 4T~

Ta có thể đếm số cặp ~(i,j)~ sao cho ~a_i + b_j~ thỏa một trong hai điều kiện trên bằng cách: với mỗi giá trị ~a_i~, ta cần đếm số phần tử của mảng ~b~ thuộc một trong hai đoạn ~[T − a_i;2T − a_i − 1]~ và ~[3T −a_i;4T −a_i −1]~. Có thể thực hiện điều này trong ~O(logn)~ bằng cách chặt nhị phân (sau khi đã sắp xếp lại mảng ~b~ theo thứ tự tăng dần) hoặc trong ~O(1)~ bằng kĩ thuật mảng cộng dồn.

Độ phức tạp: ~O(nlognloga_i)~ hoặc ~O((n + a_i)loga_i)~


Comments

Please read the guidelines before commenting.


There are no comments at the moment.