51nod1295 XOR key

时间:2022-03-26 17:09:49

第一次写可持久化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;
}

  

题目来源: HackerRank
基准时间限制:1.5 秒 空间限制:262144 KB 分值: 160 难度:6级算法题
51nod1295 XOR key 收藏
51nod1295 XOR key 关注
给出一个长度为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