Solutions of Sub-subsequence - MarisaOJ: Marisa Online Judge

Solutions of Sub-subsequence

Select solution language

Write solution here.


User Avatar Shiba_Engine    Created at    0 likes

Để giải quyết bài toán trên ta cần biết một số kiến thức sau: 1. Max Xor của 1 đoạn từ [1..i] sử dụng Trie 2. Chia block với mỗi block có S phần tử Ở đây ta đánh số các block từ $0$ đến $m$ để thuận tiện cho việc xử lý với $m$ là số block, khi đó ta gọi: - $fbl_{i, j}$ là max xor của 1 đoạn con liên tiếp $[l, r]$ thuộc block từ $i$ đến block $j$. - $fsuf_{i, j}$ là max xor của đoạn con liên tiếp $[l, r]$ mà $i \le l \le r$ và $l, r$ thuộc trong đoạn block từ $j$ đến $m$. - $fpre_{i, j}$ là max xor của đoạn con liên tiếp $[l, r]$ mà $l \le r \le i$ và $l, r$ thuộc trong đoạn block từ $0$ đến $j$. Dễ nhận thấy rằng truy vấn $l, r$ của ta sẽ đưa về 2 trường hợp: - $l, r$ thuộc cùng một block: - Khi đó, vì $l, r$ thuộc cùng một block nên ta biết rằng $r-l+1 \le S$, và ta có thể duyệt từ $l$ đến $r$ để tìm kết quả. - $l, r$ không thuộc cùng một block: - Ta có thể lấy kết quả của $3$ mảng đã tính trước ở trên với: - $fbl_{bl, br}$ với $bl$ là block chứa $l$ và $br$ là block chứa $r$. - $fsuf_{l, br-1}$ với $br$ là block chứa $r$. - $fpre_{r, bl+1}$ với $bl$ là block chứa $l$. - Với kết quả trên ta còn tính thiếu max xor trong đoạn $[x, y]$ mà $x \in bl$ và $y \in br$ và $l \le x, y \le r$, ta có thể tính kết quả này dễ dàng. Việc còn lại là chọn giá trị S phù hợp. Để ý rằng độ phức tạp để tiền xử lý 3 mảng trên là $O(log_{max(a)} * (n / S) ^ 2 * S)$ và độ phức tạp của truy vấn là $O(q * log_{max(a)} * S)$. Để thời gian tốt nhất ta chọn S sao cho cực đại của phép tiền xử lý và truy vấn là nhỏ nhất.