51nod1295 XOR key
第一次写可持久化trie指针版我。。。
//Null 的正确姿势终于学会啦qaq、、、 #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define clr(x,c) memset(x,c,sizeof(x)) int read(){ int x=0;char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) x=x*10+c-'0',c=getchar(); return x; } const int nmax=5e4+5; const int inf=0x7f7f7f7f; struct node{ int sm;node *l,*r; node():sm(0){}; }; node ns[nmax*35],*pt=ns,*rt[nmax],*Null; node* update(node *t,int x,int cur){ node *p=pt++;p->sm=t->sm+1; if(cur<0) return p; int tp=(x>>cur)&1; if(tp) p->l=t->l,p->r=update(t->r,x,cur-1); else p->r=t->r,p->l=update(t->l,x,cur-1); return p; } int query(node *t,node *s,int x,int cur){ if(cur<0) return 0; int tp=((x>>cur)&1)^1; if(!tp){ if(t->l->sm==s->l->sm) return query(t->r,s->r,x,cur-1); return (1<<cur)+query(t->l,s->l,x,cur-1); }else{ if(t->r->sm==s->r->sm) return query(t->l,s->l,x,cur-1); return (1<<cur)+query(t->r,s->r,x,cur-1); } } int main(){ int n=read(),m=read(),u,v,d; Null=pt++;Null->l=Null->r=Null; rt[0]=Null;rt[1]=update(rt[0],0,30); rep(i,1,n) u=read(),rt[i+1]=update(rt[i],u,30); rep(i,1,m){ d=read(),u=read()+1,v=read()+1; printf("%d\n",query(rt[v+1],rt[u],d,30)); } return 0; }
收藏
关注
给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R)。求A[L] 至 A[R] 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值是多少?
Input
第1行:2个数N, Q中间用空格分隔,分别表示数组的长度及查询的数量(1 <= N <= 50000, 1 <= Q <= 50000)。 第2 - N+1行:每行1个数,对应数组A的元素(0 <= A[i] <= 10^9)。 第N+2 - N+Q+1行:每行3个数X, L, R,中间用空格分隔。(0 <= X <= 10^9,0 <= L <= R < N)
Output
输出共Q行,对应数组A的区间[L,R]中的数与X进行异或运算,所能得到的最大值。
Input示例
15 8 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 10 5 9 1023 6 6 33 4 7 182 4 9 181 0 12 5 9 14 99 7 8 33 9 13
Output示例
13 1016 41 191 191 15 107 47