BZOJ3261最大异或和(可持久化字典树)

#include
using namespace std;
const int MAXN=600000+10;
int a[MAXN],b[MAXN];
int tri[MAXN*25][2],sum[MAXN*25][2];
int root[MAXN],cnt;
void insert(int wei,int &x,int y,int vl){
    if(wei<0)return;
    x=++cnt;
    int tmp=((vl>>wei)&1);
    sum[x][tmp]=sum[y][tmp]+1;
    sum[x][tmp^1]=sum[y][tmp^1];
    tri[x][tmp^1]=tri[y][tmp^1];
    insert(wei-1,tri[x][tmp],tri[y][tmp],vl);
}
int query(int wei,int x,int y,int vl){
    if(wei<0)return 0;   
    int tmp=((vl>>wei)&1);
    if(sum[y][tmp^1]-sum[x][tmp^1]!=0){
        return (1<

你可能感兴趣的:(BZOJ3261最大异或和(可持久化字典树))