51nod1295 XOR key
2016-07-09 12:27
330 查看
链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1295
题意:中文题。
分析:裸的可持久化trie树,练习题。
代码:
#include<map> #include<set> #include<cmath> #include<queue> #include<bitset> #include<math.h> #include<vector> #include<string> #include<stdio.h> #include<cstring> #include<iostream> #include<algorithm> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; const int N=50010; const int MAX=1000000100; const int mod=100000000; const int MOD1=1000000007; const int MOD2=1000000009; const double EPS=0.00000001; typedef long long ll; const ll MOD=1000000007; const int INF=1000000010; const double pi=acos(-1.0); typedef double db; typedef unsigned long long ull; int tot=0,ls[35*N],rs[35*N],root ,sum[35*N]; int add(int x,int y) { int i,ret=++tot,now=ret; sum[now]=sum[x]+1; ls[now]=ls[x];rs[now]=rs[x]; for (int i=30;i>=0;i--) if (y&(1<<i)) { rs[now]=++tot; now=tot;x=rs[x]; sum[now]=sum[x]+1; ls[now]=ls[x];rs[now]=rs[x]; } else { ls[now]=++tot; now=tot;x=ls[x]; sum[now]=sum[x]+1; ls[now]=ls[x];rs[now]=rs[x]; } return ret; } int getans(int x,int y,int z) { int i,ret=0; for (i=30;i>=0;i--) if ((1<<i)&z) { if (sum[ls[x]]>sum[ls[y]]) { ret+=1<<i;x=ls[x];y=ls[y]; } else { x=rs[x];y=rs[y]; } } else { if (sum[rs[x]]>sum[rs[y]]) { ret+=1<<i;x=rs[x];y=rs[y]; } else { x=ls[x];y=ls[y]; } } return ret; } int main() { int i,n,q,l,r,x; scanf("%d%d", &n, &q); for (i=1;i<=n;i++) { scanf("%d", &x); root[i]=add(root[i-1],x); } while (q--) { scanf("%d%d%d", &x, &l, &r);l++;r++; printf("%d\n", getans(root[r],root[l-1],x)); } return 0; }
相关文章推荐
- ios 弹出框
- 详解神秘Linux内核
- mongodb的修改器
- 初识python之简单方便及一些注意事项
- 最长回文子串
- 反射与内省
- Java中的equals和hashCode方法详解
- First Missing Positive
- Shell中字符串反转的几种技巧
- IOS实现中间凸起圆形TabBar
- 解读PHP数组排序
- Linux ffmpeg命令的介绍与使用
- 哈密顿回路
- 02.Redis主从集群的Sentinel配置
- node start - hello world http server
- Linux下ffmpeg的各种编解码器的安装
- [javaEE] tomcat内部连接池
- POJ 2096 Collecting Bugs
- Java学习总结(16.07.08)Object类的几个常用方法
- 实现wordpress文章页调用同分类上/下一篇文章