您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: