Skip to content

DTQG #3 Editorial

17 Nov 2023

Bài 1

Khi làm những bài đếm palindrome, ta thường nghĩ đến việc "đi từ giữa ra". Có thuật toán manacher cũng chung suy nghĩ như vậy.

Dễ thấy đây là một bài quy hoạch động đếm. Kết hợp với ý tưởng đi từ giữa trên, ta sẽ chia đường đi từ đến thành đường đi từ đến giữa và từ đến giữa.

Gọi trạng thái là số đường đi palindrome tạo được nếu chỉ xét đường đi xuất phát từ đang kết thúc tại và đường đi xuất phát từ đang kết thúc tại . Lúc này để cập nhật ta chỉ việc for các ô tiếp theo.

Tuy nhiên cách làm trên chưa fit với giới hạn . Ta nhận thấy là chiều không thật sự cần thiết. Vì nếu biết ta sẽ suy ra được . Do đó ta giảm được một chiều.

Bài 2

Bài này ta nghĩ ngay đến đếm contribution vì biểu thức có vẻ tách được ra. Xét mọi vị trí trong dãy . Ta sẽ đếm xem đóng góp bao nhiêu bao đáp án.

Thật vậy, nếu xét một đoạn chứa , giả sử đoạn này có số nhỏ hơn , ta sẽ biết là đóng góp vào đáp án một lượng . Tuy nhiên duyệt qua hết , không phải cách làm AC.

Ta thấy thật ra là tổng của giá trị nên ta có thể chia ra làm hai khoảng riêng biệt (có thể hiểu là khoảng đóng góp , khoảng đóng góp với ). Ta chuyển bài toán thành xét bộ ba với ý nghĩa , hoặc sẽ đóng góp bao nhiêu vào đáp án.

Chú ý một phần còn thừa ở công thức. Phần này phải cộng riêng ra.

Giải với TH1 (còn TH2 tương tự): giờ nếu ta duyệt và duyệt , ta sẽ lấy mọi . Bộ ba trong TH này sẽ đóng góp vào đáp án với là số lượng số bé hơn trong khoảng . Bỏ qua (vì mọi đều như nhau) thì đáp án sẽ tăng thêm một lượng là . Cách làm này mất . Để cải tiến, ta viết thêm:

Giả sử các vị trí lần lượt là .

Với trong đoạn , đáp án sẽ tăng thêm một lượng .

Với trong đoạn , đáp án sẽ tăng thêm một lượng .

...

Với trong đoạn , đáp án sẽ tăng thêm một lượng .

Tạm thời bỏ qua vì đây là hằng số. Ta tách công thức toán:

.

Ví dụ có các vị trí:

, , , .

tăng

tăng

tăng

Tổng tăng: .

Chứng minh xin nhuòng bạn đọc.

Từ đây, ta có cách làm là lấy tổng thoả mãn . Để duy trì việc này, có thể dùng segment tree.

TH2 tương tự cách làm trên, toán cũng tách ra tương tự.

Bài 3

Ta thực hiện thao tác gán nếu cả đoạn bằng , truy vấn vào một phần tử bằng thì ta chỉ việc in ra.

Giờ ta cần quan tâm xem phần tử có thể bằng hay N/A. Để phần tử bằng thì ta phải có một truy vấn với trước đó, và ta cũng cần đảm bảo rằng phần tử còn lại được xác định bằng rồi.

Ta sẽ tìm hai vị trí , xa nhất sao cho toàn toàn . Ta cần biết có truy vấn nào với không. Để xử lí, ta dùng segment tree, một segtree lưu các vị trí , có thao tác gán và cnp trên cây. Một segtree lưu min các khi gặp các truy vấn . Không xảy ra trường hợp vì các truy vấn được giả định là đúng.