LQDOJ Cup 2025 - Round #2 - Đếm cặp XOR

Xem PDF



Tác giả:
Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, Output, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 2600 (p) Thời gian: 3.5s Bộ nhớ: 512M Input: xorpair.inp Output: xorpair.out

Cho hai dãy số nguyên không âm \(l_1, l_2, \ldots l_n\)\(r_1, r_2, \ldots, r_n\). Bạn cần xử lý \(q\) truy vấn thuộc một trong ba loại sau:

  • L u v c: Gán mọi phần tử \(l_u, l_{u + 1}, \ldots, l_v\) bằng giá trị \(c\).
  • R u v c: Gán mọi phần tử \(r_u, r_{u + 1}, \ldots, r_v\) bằng giá trị \(c\).
  • Q u v: Bạn cần giải bài toán đếm sau:
    • xét các bộ số nguyên không âm \((x, y, i, j)\) thỏa mãn đồng thời các điều kiện:
      • \(u \le i < j \le v\)
      • \(l_i \leq x \leq r_i\)
      • \(l_j \leq y \leq r_j\)
    • Gọi \(c_0\) là số bộ \((x, y, i, j)\) thỏa mãn các điều kiện kể trên đồng thời số bit \(1\) trong biểu diễn nhị phân của \(x \oplus y\)một số chẵn.
    • Gọi \(c_1\) là số bộ \((x, y, i, j)\) thỏa mãn các điều kiện kể trên đồng thời số bit \(1\) trong biểu diễn nhị phân của \(x \oplus y\)một số lẻ.
    • Hãy tính \(c_0\)\(c_1\).

Dữ liệu đảm bảo, trong mọi thời điểm, \(l_i \leq r_i\) với mọi \(1 \leq i \leq n\). Hãy xử lý các truy vấn trên.

Nhắc lại, phép toán \(\oplus\) (xor) đối với bit được định nghĩa như sau:

  • \(0 \oplus 0 = 0\),
  • \(1 \oplus 0 = 1\),
  • \(0 \oplus 1 = 1\),
  • \(1 \oplus 1 = 0\).

Phép toán \(\oplus\) đối với các số có nhiều hơn một bit được thực hiện theo từng bit. Ví dụ:

  • \(2 \oplus 3 = 1\) \((10_2 \oplus 11_2 = 01_2)\),
  • \(2 \oplus 5 = 7\) \((010_2 \oplus 101_2 = 111_2)\),
  • \(5 \oplus 5 = 0\) \((101_2 \oplus 101_2 = 000_2)\).

Input

  • Dòng đầu tiên chứa hai số nguyên \(n\)\(q\) (\(1 \le n, q \le 3 \cdot 10^5\)).
  • Trong \(n\) dòng tiếp theo, dòng thứ \(i\) chứa hai số nguyên \(l_i\)\(r_i\) (\(0 \le l_i \le r_i < 2^{60}\)), là các giá trị ban đầu của hai dãy.
  • \(q\) dòng cuối cùng, mỗi dòng mô tả một truy vấn theo một trong ba định dạng:
    • L u v c
    • R u v c
    • Q u v
      (với \(1 \le u \le v \le n\)\(0 \le c < 2^{60}\))

Output

Với mỗi truy vấn loại \(3\), in ra trên một dòng hai số nguyên lần lượt là phần dư của \(c_0\)\(c_1\) khi chia cho \(10^9 + 22071997\).

Scoring

  • Subtask \(1\) (\(5\) điểm): \(n, q \le 40\) và trong mọi thời điểm \(0 \le l_i \le r_i \le 90\).
  • Subtask \(2\) (\(23\) điểm): \(n, q \le 200\) và trong mọi thời điểm \(0 \le l_i \le r_i \le 7000\).
  • Subtask \(3\) (\(17\) điểm): \(n, q \le 500\).
  • Subtask \(4\) (\(19\) điểm): Trong mọi thời điểm, \(l_1 = l_2 = \ldots = l_n = 0\) và tồn tại các số nguyên không âm \(e_1, e_2, \ldots e_n\) sao cho \(r_i = 2^{e_i} - 1\) với mọi \(1 \leq i \leq n\).
  • Subtask \(5\) (\(19\) điểm): Không có truy vấn loại \(1\)\(2\).
  • Subtask \(6\) (\(17\) điểm): Không có ràng buộc gì thêm.

Example

Test 1
Input
3 3
1 2
3 4
5 6
Q 1 3
R 1 2 4
Q 1 3
Output
4 8
8 12
Note

Ban đầu, ta có:

  • \(l_1 = 1\)\(r_1 = 2\)
  • \(l_2 = 3\)\(r_2 = 4\)
  • \(l_3 = 5\)\(r_3 = 6\)

1. Xử lý truy vấn Q 1 3 lần thứ nhất:

Ta cần xét các cặp chỉ số \((i, j)\) thỏa mãn \(1 \leq i < j \leq 3\). Các cặp đó là \((1, 2), (1, 3), (2, 3)\).

    • \(1 \oplus 3 = 2\) (số bit \(1\)\(1\)~-- lẻ)
    • \(1 \oplus 4 = 5\) (số bit \(1\)\(2\)~-- chẵn)
    • \(2 \oplus 3 = 1\) (số bit \(1\)\(1\)~-- lẻ)
    • \(2 \oplus 4 = 6\) (số bit \(1\)\(2\)~-- chẵn)

    Với cặp \((i, j) = (1, 2)\): \(x\) có thể là \(1, 2\). \(y\) có thể là \(3, 4\).

    Kết quả: 2 chẵn, 2 lẻ.

  • Với cặp \((i, j) = (1, 3)\): \(x \in \{1, 2\}\), \(y \in \{5, 6\}\). Đếm tương tự, ta có: 0 chẵn, 4 lẻ.

  • Với cặp \((i, j) = (2, 3)\): \(x \in \{3, 4\}\), \(y \in \{5, 6\}\). Đếm tương tự, ta có: 2 chẵn, 2 lẻ.

Tổng kết cho truy vấn \texttt{Q 1 3} đầu tiên:

  • Tổng số bộ có số bit \(1\) trong biểu diễn nhị phân của \(x \oplus y\) là một số chẵn: \(2 + 0 + 2 = 4\).
  • Tổng số bộ có số bit \(1\) trong biểu diễn nhị phân của \(x \oplus y\) là một số lẻ: \(2 + 4 + 2 = 8\).

Kết quả in ra: 4 8

2. Xử lý truy vấn R 1 2 4:

Truy vấn này cập nhật các giá trị \(R_i\) tại các vị trí \(i \in [1, 2]\) thành \(4\). Hai dãy số lúc này trở thành:

  • \(l_1 = 1\)\(r_1 = 4\)
  • \(l_2 = 3\)\(r_2 = 4\)
  • \(l_3 = 5\)\(r_3 = 6\)

3. Xử lý truy vấn Q 1 3 lần thứ hai:

Ta lại xét các cặp chỉ số \((1, 2), (1, 3), (2, 3)\) với các khoảng giá trị mới.

  • Với cặp \((i, j) = (1, 2)\): \(x \in \{1, 2, 3, 4\}\), \(y \in \{3, 4\}\). Đếm tương tự như trên, ta có: 4 chẵn, 4 lẻ.
  • Với cặp \((i, j) = (1, 3)\): \(x \in \{1, 2, 3, 4\}\), \(y \in \{5, 6\}\). Đếm tương tự như trên, ta có: 2 chẵn, 6 lẻ.
  • Với cặp \((i, j) = (2, 3)\): \(x \in \{3, 4\}\), \(y \in \{5, 6\}\). Đếm tương tự như trên, ta có: 2 chẵn, 2 lẻ.

Tổng kết cho truy vấn Q 1 3 thứ hai:

  • Tổng số bộ có số bit \(1\) trong biểu diễn nhị phân của \(x \oplus y\) là một số chẵn: \(4 + 2 + 2 = 8\).
  • Tổng số bộ có số bit \(1\) trong biểu diễn nhị phân của \(x \oplus y\) là một số lẻ: \(4 + 6 + 2 = 12\).

Kết quả in ra: 8 12

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.

Kỳ thi: