bzoj 3261 最大异或和 可持久化trie树

查询 i 属于【l,r】 中  p[i] ^ p[i+1 ] ^ ....^p[n]^x 中的最大值

b【i】 为 p【1】^p【2】^……^p【i】 的异或值。

也就是查询   b【i-1】^ b【n】^ X    (i属于 [l,r])

也就是变成在 一个区间中查询 对于A = (b[n]^ X)的最大的异或值。

所以应该维护 b【i-1】。

trick 对于 i =1  b[0] = 0;  没有想到。 如果不插入 0的话, 结果p[i] ^ p[i+1 ] ^ ....^p[n]^x 中不会选到第一个节点。

i=2 b[1] = a[1];

i =3  b[2]= a[1]^a[2].

利用可持久化tire树,可以实现 在区间中 查询区间中的  数 跟 X异或和 最大值。

/**************************************************************
    Problem: 3261
    User: OceanLight
    Language: C++
    Result: Accepted
    Time:4228 ms
    Memory:294360 kb
****************************************************************/
 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define REP(i,n) for(int i=0;is[0] = null->s[1] = null;
    null->sum = 0;
}
Node *insert(int v,int d,Node *root){
     Node *rt = &nodes[C++];
     rt->s[0] = root->s[0];
     rt->s[1] = root->s[1];
     rt->sum = root->sum+1;
     if(d<0)return rt;
     int p = (v>>d)&1;
     rt->s[p] = insert(v,d-1,root->s[p]);
     return rt;
}
int query(int v,int d,Node *rt1,Node *rt2){
    if(d<0)return 0;
    int p = (v>>d)&1;
    if(rt2->s[p^1]->sum - rt1->s[p^1]->sum){
          return (1<s[p^1],rt2->s[p^1]);
    }
    return query(v,d-1,rt1->s[p],rt2->s[p]);
}
const int K = 24;
char tmp[10];
int main(){
    //cout << (1<


你可能感兴趣的:(数据结构)