原題鏈結
給定乙個非負整數序列 a,初始長度為 n。
有 m 個操作,有以下兩種操作型別:
1、」a x」:新增操作,表示在序列末尾新增乙個數 x,序列的長度 n 增大1。
2、」q l r x」:詢問操作,你需要找到乙個位置 p,滿足\(l≤p≤r\),使得:\(a[p] xor a[p+1] xor … xor a[n] xor x\) 最大,輸出這個最大值。
可持久化 trie 模板。
max_id 儲存當前子樹最大的下標值。
#include #include #include using namespace std;
const int n=600010,m=n*25;
int n,m,s[n],tr[m][2],max_id[m];
int root[n],idx;
void insert(int i,int k,int p,int q)
int v=s[i]>>k&1;
if(p) tr[q][v^1]=tr[p][v^1];
tr[q][v]=++idx;
insert(i,k-1,tr[p][v],tr[q][v]);
max_id[q]=max(max_id[tr[q][0]],max_id[tr[q][1]]);
}int query(int root,int c,int l)
return c^s[max_id[p]];
}inline int read()
int res=0;
while(ch>='0' && ch<='9')
return f*res;
}int main()
char op[2];
int l,r,x;
while(m--)
else
}return 0;
}
acwing143 144最大異或和
acwing143 在給定的n個整數a1,a2 an中選出兩個進行xor 異或 運算,得到的結果最大是多少?建乘一字典樹。插入0,1 從高位向低位 查詢相當於貪心?因為從高位查起,所以滿足這一位即使後面每一位不滿足,也比這一位不滿足後面每一位都滿足要強 二進位制真好 include include ...
最大異或和
問題描述 給出n個整數,多組詢問求乙個給出的數與這n個數中的乙個數的最大異或的值。輸入格式 第一行乙個整數n,表示有個數字。第二行n個正整數。第三行乙個整數m,表示m個詢問。第四行m個整數,表示m個詢問的整數。輸出格式 共m行,對於每個詢問輸出最大的異或值。輸入樣例 43 5 6 7 31 4 7 ...
最大異或和
展開 題目描述 給定乙個非負整數序列 初始長度為nn。有 mm 個操作,有以下兩種操作型別 a x 新增操作,表示在序列末尾新增乙個數 xx,序列的長度 n 1n 1。q l r x 詢問操作,你需要找到乙個位置 pp,滿足l le p le rl p r,使得 a p oplus a p 1 op...