Codechef Xor Queries(可持久化字典树)
来源:互联网 发布:淘宝 企业店铺 假货 编辑:程序博客网 时间:2024/04/30 02:46
题意:
给定一个初始时为空的整数序列(元素由1开始标号)以及一些询问:
类型0:在数组最后加入数字x
类型1:在区间[L,R]中找到数字y,最大化(x^y)
类型2:删除数组最后k个元素
类型3:在区间[L,R]中,统计小于等于x的元素个数
类型4:在区间[L,R]中,找到第k小的数
(M<=5e5,x<=5e5)
#include<cstdio>#include<algorithm>using namespace std;const int N=5e5+100;struct Trie{ int ch[2],sum,dep;}T[N*30];int root[N],sz;void insert(int &i,int d,int x,int v){ T[++sz]=T[i],i=sz; T[i].dep=d+1; T[i].sum+=v; //此时判断的是上一位的d if(d<0) return ; int p=(x>>d)&1; insert(T[i].ch[p],d-1,x,v);}void Query_max_xor(int L,int R,int d,int x,int &ans){ if(d<0) return ; int p=(x>>d)&1; if(T[ T[R].ch[p^1] ].sum-T[ T[L].ch[p^1] ].sum) ans+=(p^1)*(1<<d),Query_max_xor(T[L].ch[p^1],T[R].ch[p^1],d-1,x,ans); else ans+=p*(1<<d),Query_max_xor(T[L].ch[p],T[R].ch[p],d-1,x,ans);}void Query_equal_to_x(int L,int R,int d,int x,int &ans){ if(d<0) {ans+=T[R].sum-T[L].sum;return ;} int p=(x>>d)&1; if(p==1) ans+=T[ T[R].ch[0] ].sum-T[ T[L].ch[0] ].sum; Query_equal_to_x(T[L].ch[p],T[R].ch[p],d-1,x-p*(1<<d),ans);}void Query_kth(int L,int R,int d,int x,int &ans){ if(d<0) return ; int k=T[ T[R].ch[0] ].sum-T[ T[L].ch[0] ].sum; if(k>=x) Query_kth(T[L].ch[0],T[R].ch[0],d-1,x,ans); else ans+=(1<<d),Query_kth(T[L].ch[1],T[R].ch[1],d-1,x-k,ans);}int main(){ int m,n=0,L,R,ans,op,x; while(scanf("%d",&m)!=EOF){ sz=0,root[0]=0; while(m--){ scanf("%d",&op); if(op==0){ scanf("%d",&x); root[++n]=root[n-1]; insert(root[n],23,x,1); } else if(op==1){ scanf("%d%d%d",&L,&R,&x); Query_max_xor(root[L-1],root[R],23,x,ans=0); printf("%d\n",ans); } else if(op==2) scanf("%d",&x),n-=x; else if(op==3){ scanf("%d%d%d",&L,&R,&x); Query_equal_to_x(root[L-1],root[R],23,x,ans=0); printf("%d\n",ans); } else if(op==4){ scanf("%d%d%d",&L,&R,&x); Query_kth(root[L-1],root[R],23,x,ans=0); printf("%d\n",ans); } } } return 0;}
0 0
- Codechef Xor Queries(可持久化字典树)
- 【CodeChef-XRQRS】Xor Queries【可持久化Trie / +主席树】
- BZOJ 4546|CodeChef XRQRS|Xor Queries|可持久化Trie
- [可持久化字典树] BZOJ 4546 codechef XRQRS
- 【Codechef】【Chef and Graph Queries】Lct 可持久化线段树
- CodeChef XRQRS - Xor Queries
- 【Codechef ForbidenSum】可持久化线段树
- 51Nod——1295 XOR key(贪心+可持久化字典树)
- 可持久化字典树
- BZOJ 4260 Codechef REBXOR 可持久化Trie树
- 【BZOJ4546】codechef XRQRS【可持久化Trie / +主席树】
- 【BZOJ 4260】Codechef REBXOR 可持久化trie树
- 51nod 1295 XOR key 01trie(可持久化字典树坑已填)
- BZOJ 3261 可持久化字典树
- BZOJ3166 && BZOJ3261 可持久化字典树
- hdu4757(LCA+可持久化字典树)
- 模板 可持久化字典树
- bzoj4546 -- 可持久化字典树
- MATLAB数组加减法
- 有一个分数序列:2/1, 3/2, 5/3, 8/5, 13/8, …编写程序求出这个序列的前n项之和。
- 关于RN的配置流程
- 用实例理解Storm的Stream概念
- 面试--华为资料开发工程师
- Codechef Xor Queries(可持久化字典树)
- 【数据结构】堆,堆实现优先级队列,堆排序
- 3-04 嵌入式Linux根文件系统制作与挂载
- Python——类的定义和超类
- UFLDL练习(Sparse Autoencoder)
- Volley加载网络数据加载网咯图片
- js笔记 -- toString() 和String()
- android手机(平板)下载文件后,在文件管理软件中可以看到,通过mtp模式连接电脑后,无法在电脑上看到
- codeforcesGym 101102H