bzoj3261 最大異或和 可持久化trie

2021-08-21 15:57:38 字數 937 閱讀 3671

我們先考慮沒有修改操作,只有詢問的話怎麼做,我們記sum[i]表示i的字尾異或和,那麼我們每個詢問相當於查詢區間對乙個數x異或後的最大值,那麼貪心很明顯,位數從高到低,如果有數這個位置上可以和x異或起來是1,那麼我肯定不會去選和x異或起來這位上是0的。根據這個性質,我們考慮trie樹,如果當前節點的子節點有能和x異或起來為1的節點,就走下去,不然只能走另一邊了,那麼區間的話我們就可持久化一下,這個具體就和主席樹是一模一樣的了,這裡不多贅述了。

接下來我們要考慮修改的問題,我們另sum[i]表示i的字首異或和,注意這裡和上面不同了,變成了字首,那麼我們每個點到n的異或和就可以表示為sum[i-1]^sum[n]了對吧,接下來的步驟就和上面是一樣的了。

#include

#include

#include

#include

#include

#include

#define ll long long

#define n (600005)

using

namespace

std;

int n,m,x,l,r,now,ans,cnt;

int sum[n],root[n],size[20000005],son[20000005][2];

char c[10];

template

void read(t&t)

do while (isdigit(p));

if (!fl) t=-t;

}void insert(int &u,int pre,int data,int ws)

void query(int l,int r,int ws)

int main()

while (m--)

if (c[0]=='q')

}return

0;}

bzoj 3261 最大異或和

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

bzoj3261 最大異或和

看了看可持久化trie,發現跟主席樹的思想一毛一樣,遵循羅哥的思想看懂演算法不看 自己實現一發就過了真爽 此題所求可以轉化為在sum l 1 sum r 1 中找乙個數字與sum n x 異或最大,很顯然就是trie的經典應用。我們對於異或字首和建立前i個異或字首和的trie,我們從前r 1個異或字...

BZOJ3261 最大異或和

其實還是先求出來字首異或和,剩下的就是可持久化01trie 其實和主席樹差不多,我們對每乙個節點都建立一顆trie樹。在這個題裡面,用cnt i 來表示節點編號為i的這個點所表示的字首出現了多少次,我們利用差分思想就可以求出來這個字首在當前區間中到底有沒有出現。注意我們建樹的時候,假設當前這個節點沒...