計蒜客15430 XOR Queries(Trie處理位運算問題)
阿新 • • 發佈:2017-05-20
ron 二進制 進制 插入 我們 整數 容易 位置 xor
題意:
給出一個長度為n的數組C,回答m個形式為(L, R, A, B)的詢問,
含義為存在多少個不同的數組下標k屬於[L, R]滿足C[k] XOR A >= B(式中XOR為異或運算)。
T組測試數據.
每組第一行為兩個整數n, m.(1 <= n, m <= 5e4).
第二行n個整數表示數組C.(0 <= C[i] <= 1e9).
接下來m行,第i行四個整數L[i], R[i], A[i], B[i](1 <= L[i] <= R[i] <= n, 0 <= A[i], B[i] <= 1e9.
對於每次詢問,輸出一個整數表示滿足條件的數組下標數目。
分析:
對於一個區間[L,R],求滿足C[k] xor A >= B的數目,那麽怎麽求呢?
我們可以對這段區間的每個數二進制化,然後從高位開始往低位,去建一個trie樹,並計算出每個trie樹的節點下面有多少個數,這樣就可以通過A在trie樹上移動得到最後結果,時間復雜度O(logn)
那麽對於這樣變化的區間,容易想到莫隊,確實可以
不過有個更好的想法,就是ans[L,R]=ans[R]-ans[L-1],所以就是求前綴的答案就行了
也就是每次往trie樹中插入一個數,然後去更新該位置有的答案(提前預處理出每個詢問對應哪些個位置)
計蒜客15430 XOR Queries(Trie處理位運算問題)