Description
给出n个非负整数A[1]..A[n],编程回答询问:l r x:询问 max {x xor A[i] | l<=i<=r}的值。
Input
第一行为整数n。 第二行为n个非负整数,表示A[1],A[2],…,A[n]。 第三行为整数m。 之后的m行,每行表示一种询问:l r x(1<=l<=r<=n)
Output
对于每个询问,给出你的回答。
#include
#include
#include
using namespace std;
typedef unsigned long long ull;
const int MAXN=500005;
const int MAXNODE=MAXN*64;
int ch[MAXNODE][2];
int root[MAXN];
int np;
ull sz[MAXNODE];
char c;
void scan(ull &x)
{
for(c=getchar();c<'0'||c>'9';c=getchar());
for(x=0;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';
}
char num[50];int ct;
void print(ull x)
{
ct=0;
if(x==0) num[ct++]='0';
while(x) num[ct++]=x%10+'0',x/=10;
while(ct--) putchar(num[ct]);
putchar('\n');
}
void init()
{
memset(sz,0,sizeof(sz));
memset(root,0,sizeof(root));
memset(ch,0,sizeof(ch));
np=0;
}
void pushup(int now)
{
sz[now]=sz[ch[now][0]]+sz[ch[now][1]];
}
void insert(int pre,int &now,int i,ull x)
{
now=++np;//新建一个版本
sz[now]=sz[pre];//复制前一个版本
if(i<0)
{
sz[now]++; //这个版本自己本身有一个元素
return;
}
int d=(x>>i)&1;
ch[now][d^1]=ch[pre][d^1]; //d^1子树与前一个版本共用,因为当前元素不走这边
insert(ch[pre][d],ch[now][d],i-1,x);//d子树新建 ,当前元素走的是这边
pushup(now); //更新这个节点上的值,用于后面查询判断
}
ull ques(int l,int r,int i,ull x)
{
if(i<0) return 0;
int d=(x>>i)&1;
int t=sz[ch[r][d^1]]-sz[ch[l][d^1]]; //说明r这边确实有d^1这条路(因为它比之前的版本大)
if(t>0) return ques(ch[l][d^1],ch[r][d^1],i-1,x)+((ull)1<>M;
for(i=1;i<=M;i++)
{
scan(L);scan(R);scan(x);
print(ques(root[L-1],root[R],63,x));//询问这个版本区间
}
return 0;
}
数组大小
插入操作
void insert(int &now,int i,ull x)
{
if(!now) now=++np;
if(i<0) return;
int d=(x>>i)&1;
insert(ch[now][d],i-1,x);
}
void insert(int pre,int &now,int i,ull x)
{
now=++np; //新建一个版本(新的起点)
sz[now]=sz[pre];//复制前一个版本(继承)
if(i<0)
{
sz[now]++; //这个版本自己本身有一个元素
return;
}
int d=(x>>i)&1;
ch[now][d^1]=ch[pre][d^1]; //当前元素并用不上这棵子树,但是继承留给后边的用
insert(ch[pre][d],ch[now][d],i-1,x); //d子树新建 ,当前元素走的是这边
pushup(now); //更新这个节点上的元素个数,用于后面查询判断
}
区间查询
ull ques(int l,int r,int i,ull x) //A[l]~A[r],当前第i位,求解的元素为x
{
if(i<0) return 0; //如果已经分解完
int d=(x>>i)&1;
int t=sz[ch[r][d^1]]-sz[ch[l][d^1]]; //说明r的d^1这棵子树比较大,l~r之间至少有一个i位为d^1的元素
if(t>0) return ques(ch[l][d^1],ch[r][d^1],i-1,x)+((ull)1<
小结