P4735 最大異或和

2022-03-29 20:26:48 字數 1610 閱讀 6183

題目鏈結

給定乙個非負整數序列,初始長度為n。

有m個操作,有以下兩種操作型別:

a x:新增操作,表示在序列末尾新增乙個數x,序列的長度n+1。

q l r x:詢問操作,你需要找到乙個位置p,滿足l≤p≤r,使得: a[p]⊕a[p+1]⊕...⊕a[n]⊕x最大,輸出最大是多少。

輸入格式:

第一行包含兩個整數n,m,含義如問題描述所示。

第二行包含 n個非負整數,表示初始的序列a。

接下來 m行,每行描述乙個操作,格式如題面所述。

輸出格式:

假設詢問操作有 t個,則輸出應該有 t行,每行乙個整數表示詢問的答案。

輸入樣例#1:

5  5

2 6 4 3 6

a 1

q 3 5 4

a 4q 5 7 0

q 3 6 6

輸出樣例#1:

456

關於這道題思路就不再多說,主要講一下細節問題。

1 #include2 #include

3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11

#define maxn 600005

12using

namespace

std;

1314 inline int

read()

1524

while(c>='

0'&&c<='9'

)2529return res*x;30}

3132

intn,m,tot,aa;

33int last[maxn*24

],root[maxn],s[maxn];

34int tree[maxn*24][2

];35

36void trie(int i,int k,int l,int

r)37

43int c=(s[i]>>k)&1;44

if(l) tree[r][c^1]=tree[l][c^1

];45 tree[r][c]=++tot;

46 trie(i,k-1

,tree[l][c],tree[r][c]);

47 last[r]=max(last[tree[r][0]],last[tree[r][1

]]);48}

4950

int ask(int now,int val,int k,int

l)51

59else

6063}64

65int

main()

6682

for(int i=1;i<=m;i++)

8393

else

9499

}100 }

view code

P4735 最大異或和

給定乙個非負整數序列,初始長度為n。有m個操作,有以下兩種操作型別 a x 新增操作,表示在序列末尾新增乙個數x,序列的長度n 1。q l r x 詢問操作,你需要找到乙個位置p,滿足l p r,使得 a p a p 1 a n x最大,輸出最大是多少。輸入格式 第一行包含兩個整數 n,m,含義如問...

P4735 最大異或和

p4735 最大異或和 可持久化trie 據n n 0,我們可以把問題轉化為字首異或和 設為s i 也就是求 s n s p 的最大值 顯然,這是經典的trie上貪心問題。但是詢問次數過多,我們總不能每次都建一棵完整的樹。注意到,對於每次詢問我們所需的trie都只有很小的不同。於是我們就可以用可持久...

P4735 最大異或和

點我跳轉 給定乙個非負整數序列 a 初始長度為 n 有 m 個操作,有以下兩種操作型別 1 a x 新增操作,表示在序列末尾新增乙個數 x 序列的長度 n 增大 1 2 q l r x 詢問操作,你需要找到乙個位置 p 滿足 l p r 使得 a p xor a xor xor a n xor x ...