zoukankan      html  css  js  c++  java
  • 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
    ",query(rt[v+1],rt[u],d,30));
    	}
    	return 0;
    }
    

      

    题目来源: HackerRank
    基准时间限制:1.5 秒 空间限制:262144 KB 分值: 160 难度:6级算法题
     收藏
     关注
    给出一个长度为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
  • 相关阅读:
    Java 对象的封装,继承,抽象,接口写法
    python 3.7 方向键乱码
    yocto doc
    为什么要使用yocto
    ltp-ddt的makefile结构
    Git 常用命令列表
    Makefile依赖关系中的竖线“|”
    makefile 双冒号规则
    ltp makefile 解析
    makefile 变量展开
  • 原文地址:https://www.cnblogs.com/fighting-to-the-end/p/5861218.html
Copyright © 2011-2022 走看看