異或

給出 n 個數,Q次詢問,每次問[l,r]中最大連續異或和。
爲了體如今線操做,對於每次詢問(x,y):
l=min( ((x+lastans) MOD n)+1 , ((y+lastans) MOD n)+1 )
r=max( ((x+lastans) MOD n)+1 , ((y+lastans) MOD n)+1 )
1.2 輸入格式
第一行爲兩個整數n,m,分別表示數的個數和詢問次數。
接下來一行 n 個數,再接下來 m 行,每行兩個數 x,y,表示給出詢問 (x,y) ,經過上述操做獲得l和r,查詢 [l,r] 中最大連續異或和。
1.3 輸出格式
輸出m行,每行一個整數表示該次詢問的答案。
1.4 樣例輸入
3 3
1 4 3
0 1
0 1
4 3算法

1.5 樣例輸出
5
7
7
1.6 數據範圍與約定
對於30%的數據,n <= 500, Q <= 500。
對於100%的數據,n <= 12000 , Q <= 6000 , 給出的數均在signed long int 範圍內,且均爲非負數。
-------------優化

強制在線,區間連續異或和,很明顯的一道可持久化trie樹。ast

30分作法

枚舉l,r,作個前綴異或和,暴力統計就好了,複雜度O(n^3)統計


50分作法

考慮怎樣就不用枚舉r了,trie樹,對吧!咱們能夠先把每一個數加進trie裏,而後從l到r貪心往下找就好。
複雜度O(n^2logn)數據


70分算法

考慮優化上一個算法。咱們能夠用可持久化trie樹優化掉把元素加入trie的過程,好像也沒好多少查詢


100分正解

繼續優化上一個算法。既然已經能夠查詢[l,r]內與x異或最大數,咱們能夠把全部答案全預處理出來。
O(n^2logn)警報
好吧,看來不能預處理這麼多。那能不能先預處理一部分,再在詢問中處理一部分?
這不就是分塊的思想嗎!!!
因而,咱們能夠預處理出每一個塊的左端點到它右邊的全部區間的最大異或和。
設f[i][j]表示第i塊的左端點,到j,也就是[(i-1)*len+1,j]的區間最大異或和。
轉移方程就不用多說了。
因而,咱們在查詢一個[l,r]時,答案能夠來自兩部分:起始點在l-1所在的塊內,或者塊外。
對於塊內的狀況,貪心去查trie樹便可。
對於塊外,用咱們預處理的f就行。
複雜度O(n^1.5log(maxlongint))枚舉

相關文章
相關標籤/搜索