tag: dynamic programming, trie, small to large, centroid decomposition.
Đầu tiên, cho mình xin lỗi vì đề bài ngu của LKT.
Tóm tắt ngắn gọn lại đề bài: Cho một cây gồm đỉnh, độ tuyệt vời của cặp đỉnh là tổng xor của đường đi đơn từ đến . Bạn cần tìm độ tuyệt vời lớn nhất của mọi cặp và đếm xem có bao nhiêu cặp có độ tuyệt vời bằng độ tuyệt vời lớn nhất đấy.
Subtask 1
Làm gì cũng được.
ĐPT:
Subtask 2
Với mỗi đỉnh ta tiến hành dfs hoặc bfs để tính độ đẹp của đỉnh tới mọi đỉnh khác, sau đó tính đáp án theo đề bài.
ĐPT:
Subtask 3
Vì , nên độ tuyệt vời lớn nhất của đồ thị chính là . Nên nếu không tồn tại một đường đi có độ tuyệt vời là thì độ tuyệt vời của đồ thị sẽ bằng và số cặp thỏa mãn sẽ là . Nếu có tồn tại, chúng ta sẽ tiến hành đếm số đường đi có độ tuyệt vời là như sau:
Gọi là độ đẹp của cặp , là số đỉnh con sao cho , là số đỉnh con sao cho .
Ta dễ dàng tính và bằng công thức sau:
Trong đó, là đỉnh con trực tiếp của .
Khi có được và , ta có thể dễ dàng tính được đáp án (mời bạn đọc tự tính do mình lười).
ĐPT:
Subtask 4
Gọi là số đỉnh con sao cho .
Ta dễ dàng tính được bằng công thức sau: với mọi thỏa mản và là đỉnh con trực tiếp của (Tất nhiên, được cộng thêm ).
(Mình quên mất phần sau nên mình mời bạn đọc làm tiếp subtask này).
ĐPT:
Subtask 5
Để giải quyết được subtask cuối cùng, chúng ta cần giải quyết được bài toán dễ hơn:
"Cho dãy gồm số không âm, tìm tổng xor lớn nhất của một đoạn liên tiếp của mảng này".
Duyệt trâu thông thường sẽ có ĐPT là , sẽ không qua được giới hạn của bàn toán. Để tối ưu hóa, chúng ta để ý rằng tổng xor của đoạn là với là tổng xor của đoạn . Ta cố định , với mỗi ta cần tìm sao cho lớn nhất. Ta duy trì một trie
lưu các giá trị , rồi xét từ bit lớn nhất tới bit nhỏ nhất, mỗi lần như vậy ta kiểm tra xem có tồn tại sao cho bit lớn thứ bit lớn thứ của có bằng hay không. Với cách làm này, ta giảm ĐPT từ xuống . VNOI wiki cũng có phần nói về bài này Link.
Trở về bài toán chính, với mỗi đỉnh chúng ta có thể lưu một trie
chứa các giá trị . Để gộp trie một cách hiệu quả, ta sử dụng kỹ thuật small to large
. Trong quá trình gộp, ta lấy toàn bộ giá trị ở trie
nhỏ hơn, rồi coi thử xem giá trị xor lớn nhất với trie
lớn hơn là bao nhiêu bằng tư duy trên.
ĐPT:
Tài liệu tham khảo
Comments