GYM 100883 E.xortion(字典树)
2017-03-14 14:25
1106 查看
Description
给出一个长度为n的序列a[i],q次查询,每次查询给出一个x,求i使得a[i]^x最大
Input
第一行一整数T表示用例组数,每组用例首先输入两个整数n和q表示序列长度和查询数,之后n个整数a[i]表示该序列,最后q行每行一个整数x表示查询(1<=n<=1e5,1<=q<=3e5,a[i],x不会超过32位整型)
Output
对于每次查询,输入最小的i满足a[i]^x最小
Sample Input
1
3 3
3 1 2
4
5
6
Sample Output
1
3
2
Solution
字典树裸题,把所有a[i]拆成32位二进制建字典树,对于每个x,同样拆成32位二进制在字典树上查询,如果当前为是x,则在字典树上找这一层是否有x^1,如果有就从x^1往下一层走,否则只能从x往下一层走,这样找到终点就找到了a[i]使得a[i]^x最大,因为要输出的是下标所以拿map存一下a[i]和i的对应就好
Code
给出一个长度为n的序列a[i],q次查询,每次查询给出一个x,求i使得a[i]^x最大
Input
第一行一整数T表示用例组数,每组用例首先输入两个整数n和q表示序列长度和查询数,之后n个整数a[i]表示该序列,最后q行每行一个整数x表示查询(1<=n<=1e5,1<=q<=3e5,a[i],x不会超过32位整型)
Output
对于每次查询,输入最小的i满足a[i]^x最小
Sample Input
1
3 3
3 1 2
4
5
6
Sample Output
1
3
2
Solution
字典树裸题,把所有a[i]拆成32位二进制建字典树,对于每个x,同样拆成32位二进制在字典树上查询,如果当前为是x,则在字典树上找这一层是否有x^1,如果有就从x^1往下一层走,否则只能从x往下一层走,这样找到终点就找到了a[i]使得a[i]^x最大,因为要输出的是下标所以拿map存一下a[i]和i的对应就好
Code
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<ctime> using namespace std; typedef long long ll; #define INF 0x3f3f3f3f #define maxn 111111 int chd[maxn*32][2],nn=0,num[maxn*32]; void init() { nn=1; memset(chd[0],-1,sizeof(chd[0])); } void insert(int x){ int p=0; for(int i=31;i>=0;i--) { int t=(x>>i)&1; if(chd[p][t]==-1) { chd[p][t]=nn; memset(chd[nn],-1,sizeof(chd[nn])); nn++; } p=chd[p][t]; } } int find(int x) { int p=0; int ret=0; for(int i=31;i>=0;i--) { int t=((x>>i)&1)^1; if(chd[p][t]==-1)t^=1; p=chd[p][t]; ret<<=1; ret|=t; } return ret; } map<int,int>M; int T,n,q; int main() { int res=0; scanf("%d",&T); while(T--) { init(); M.clear(); scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) { int a; scanf("%d",&a); if(M.find(a)==M.end())M[a]=i,insert(a); } while(q--) { int a; scanf("%d",&a); printf("%d\n",M[find(a)]); } if(T)printf("\n"); } return 0; }
相关文章推荐
- gym 100935B (字典树)
- gym 100548题解(2014年西安现场赛(回文树,01字典树,容斥))
- GYM 100883 A.Random Fightings (状压DP)
- GYM 100883 B.Rectangles(水~)
- GYM 100883 C.Too Many Coins(水~)
- GYM 100883 D.Card Game(二分+贪心)
- GYM 100883 F.Print Mix Strings(枚举)
- GYM 100883 G.Count Mix Strings(组合数学)
- GYM 100883 H.tourists(一元线性同余方程)
- GYM 101086 C.Everything(字典树)
- [字典树 最小树形图] Codeforces Gym 100307 NEERC 13 D. Dictionary
- GYM 100883 I.Teleportia(Floyd)
- GYM 100883 J.palprime(枚举)
- Gym 100935F A Poet Computer (字典树)
- 【贪心】【字典树】Gym - 101466A - Gaby And Addition
- HDU1251-统计难题(字典树)
- Educational Codeforces Round 12 E. Beautiful Subarrays 预处理前缀+字典树优化★ ★
- 2014 xi'an Problem F. Color (Gym 100548F) 容斥原理
- Codeforces Gym 100548H The Problem to Make You Happy (图上博弈DP)
- HDU 1671 Phone List(字典树)