1. 程式人生 > >計蒜客15430 XOR Queries(Trie處理位運算問題)

計蒜客15430 XOR Queries(Trie處理位運算問題)

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處理位運算問題)