展開
題目描述
給定乙個非負整數序列 ,初始長度為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] \oplus … \oplus a[n] \oplus xa[p]⊕a[p+1]⊕…⊕a[n]⊕x 最大,輸出最大是多少。
輸入格式
第一行包含兩個整數 n,mn,m,含義如問題描述所示。
第二行包含 nn個非負整數,表示初始的序列aa 。
接下來 mm行,每行描述乙個操作,格式如題面所述。
輸出格式
假設詢問操作有 tt 個,則輸出應該有 tt 行,每行乙個整數表示詢問的答案。
輸入輸出樣例
輸入 #1複製
5 52 6 4 3 6
a 1q 3 5 4
a 4q 5 7 0
q 3 6 6
輸出 #1複製45
6說明/提示
對於測試點 1-21−2,n,m \le 5n,m≤5。
對於測試點 3-73−7,n,m \le 80000n,m≤80000。
對於測試點 8-108−10,n,m \le 300000n,m≤300000。
其中測試點 1, 3, 5, 7, 91,3,5,7,9保證沒有修改操作。
0 \le a[i] \le 10^70≤a[i]≤107。
首先操作離線下來,處理出新增完所有數後數列的狀態,直接把所有字尾異或和插入進可持久化trie樹里。然後倒著處理操作,這樣新增就變成了刪除。
刪除結尾的乙個數,剩下的所有字尾異或和都會異或上刪掉的數。在全域性維護乙個tag,刪乙個數就把tag異或上它。在查詢時只要tag這一位上為1就要反著走。
#include
#define maxn 600010
#define maxdep 23
char buf[
1<<21]
,*p1=buf,
*p2=buf;
int n,m;
int sum[maxn]
;struct trie
}*root[maxn]
,tree[maxn<<5]
,*tail;
void
init()
void
build
(trie *
&p,int dep)
void
update
(trie *
&p,trie *flag,
int dep,
int i)
intquery
(trie *p,
int x,
int dep,
int limit)
signed
main()
for(
int i=
1;i<=m;i++)if
(ch==
'q')
}return0;
}
最大異或和
問題描述 給出n個整數,多組詢問求乙個給出的數與這n個數中的乙個數的最大異或的值。輸入格式 第一行乙個整數n,表示有個數字。第二行n個正整數。第三行乙個整數m,表示m個詢問。第四行m個整數,表示m個詢問的整數。輸出格式 共m行,對於每個詢問輸出最大的異或值。輸入樣例 43 5 6 7 31 4 7 ...
3261 最大異或和
給定乙個非負整數序列,初始長度為n。有m個操作,有以下兩種操作型別 1 ax 新增操作,表示在序列末尾新增乙個數x,序列的長度n 1。2 qlrx 詢問操作,你需要找到乙個位置p,滿足l p r,使得 a p xor a p 1 xor xor a n xor x 最大,輸出最大是多少。第一行包含兩...
最大異或對
acwing 143.最大異或對 在給定的n個整數a1,a2 an中選出兩個進行xor 異或 運算,得到的結果最大是多少?輸入格式第一行輸入乙個整數n。第二行輸入n個整數a1 an。輸出格式輸出乙個整數表示答案。資料範圍1 n 105,0 ai 231 輸入樣例 3 1 2 3 輸出樣例 題解 異或...