bzoj 3261 (可持久化trie樹)

2021-07-25 08:47:12 字數 1621 閱讀 9231

time limit: 10 sec  

memory limit: 512 mb

submit: 1422  

solved: 612 [

submit][

status][

discuss]

給定乙個非負整數序列 ,初始長度為 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 最大,輸出最大是多少。  

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

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

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

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

5 52 6 4 3 6

a 1

q 3 5 4

a 4

q 5 7 0

q 3 6 6

對於測試點 1-2,n,m<=5 。

對於測試點 3-7,n,m<=80000 。

對於測試點 8-10,n,m<=300000 。

其中測試點 1, 3, 5, 7, 9保證沒有修改操作。

對於 100% 的資料, 0<=a[i]<=10^7。45

6 對於

100%

的資料,

0<=a[i]<=10^7。

[ submit][

status][

discuss]

題解:可持久化trie樹

這個題只要轉化一下就是可持久化trie樹的裸題。

我們需要維護的是一段字尾的值,但是我們是不斷加入新點的,所以直接維護字尾不好做。

因為字首是不變的所以我們維護字首,因為要求[l,r]的異或值,可以通過求[1,r]的異或字首和^[1,l-1]的異或字首和得到。

所以我們對於每個位置的字首和建立trie樹,因為要^x最大,所以我們可以先得到[1,n]異或和^x的01串, 然後在要求區間的trie樹走相反的邊,即01串中為1,如果連向0的方向有節點就向0的方向走。

#include#include#include#include#include#define n 20000003

#define bit 24

using namespace std;

int sz,n,m,a[n],root[n];

int size[n],ch[n][3];

void insert(int i,int x)

size[now]=size[pre]+1;

}int find(int i,int j,int x)

{ int ans=0;

int l=root[i]; int r=root[j];

for (int i=bit-1;i>=0;i--) {

int t=((x>>i)&1)^1;

if (size[ch[r][t]]-size[ch[l][t]]==0) t^=1;

else ans+=1<

BZOJ 3261 最大異或和 可持久化Trie樹

題目大意 給定乙個序列,提供下列操作 1.在陣列結尾插入乙個數 2.給定l,r,x,求乙個l p r,使x a p a p 1 a n 最大 首先我們可以維護字首和 然後就是使x sum n sum p 1 最大 x sum n 為定值,於是用trie樹貪心即可 考慮到l 1 p 1 r 1,我們不...

BZOJ3261 最大異或和 可持久化trie

可持久化 這個詞含義還真多 其實可持久化trie實際上就是主席trie bzoj3261傳送門 給定乙個非負整數序列 初始長度為 n。有 m個操作,有以下兩種操作型別 1 a x 新增操作,表示在序列末尾新增乙個數 x,序列的長度 n 1。2 q l r x 詢問操作,你需要找到乙個位置 p,滿足 ...

bzoj3261 最大異或和 可持久化trie

我們先考慮沒有修改操作,只有詢問的話怎麼做,我們記sum i 表示i的字尾異或和,那麼我們每個詢問相當於查詢區間對乙個數x異或後的最大值,那麼貪心很明顯,位數從高到低,如果有數這個位置上可以和x異或起來是1,那麼我肯定不會去選和x異或起來這位上是0的。根據這個性質,我們考慮trie樹,如果當前節點的...