【XSY1098】第k小 可持久化trie
来源:互联网 发布:php 换行分割 编辑:程序博客网 时间:2024/06/05 01:38
题目描述
给你一个长度为
题解
如果只有查询操作,可以用可持久化trie解决。
加上亦或操作,可以打标记解决。
与操作和或操作每次会将所有数的某些二进制变成一样,这些二进制位将来都是一样的。
所以直接暴力执行操作,然后打标记,表示这些二进制位已经相同了。如果与操作或或操作的
时间复杂度:
代码
#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<ctime>#include<utility>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<int,int> pii;int c[20000010][2];int s[20000010];int rt[50010];int cnt;int xo;int insert(int x,int v,int d){ int y=++cnt; s[y]=s[x]+1; c[y][0]=c[x][0]; c[y][1]=c[x][1]; if(d==-1) return y; int b=(v>>d)&1; c[y][b]=insert(c[y][b],v,d-1); return y;}int query(int x,int y,int k,int d){ if(d==-1) return 0; int b=(xo>>d)&1; if(s[c[y][b]]-s[c[x][b]]>=k) return query(c[x][b],c[y][b],k,d-1); return query(c[x][b^1],c[y][b^1],k-s[c[y][b]]+s[c[x][b]],d-1)|(1<<d);}int a[50010];int n,m;int all=0xffffffff,now=0;void build(){ int i; cnt=0; rt[0]=0; for(i=1;i<=n;i++) rt[i]=insert(rt[i-1],a[i],31);}int main(){ freopen("xsy1098.in","r",stdin); freopen("xsy1098.out","w",stdout); int i,j; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%d",&a[i]); build(); char op[5]; int x,y,k; for(i=1;i<=m;i++) { scanf("%s",op); if(op[0]=='X') { scanf("%d",&x); xo^=x; xo&=all; now^=x&(~all); } else if(op[0]=='O') { scanf("%d",&x); if(x&all) { all&=~x; for(j=1;j<=n;j++) a[j]&=all; build(); } now|=x&(~all); xo&=all; } else if(op[1]=='n') { scanf("%d",&x); if((~x)&all) { all&=x; for(j=1;j<=n;j++) a[j]&=all; build(); } now&=x&(~all); xo&=all; } else { scanf("%d%d%d",&x,&y,&k); int ans=query(rt[x-1],rt[y],k,31); ans|=now; printf("%d\n",ans); } } return 0;}
阅读全文
0 0
- 【XSY1098】第k小 可持久化trie
- 区间第k小 poj2104 可持久化线段树
- 可持久化trie
- 可持久化线段树入门题 hdu2665 求区间第k小的数
- [BZOJ3261]-可持久化trie
- 区间第K值(可持久化线段树)
- bzoj 2741 分块 + 可持久化trie
- hdu 4757 Tree(可持久化Trie)
- 3166: [Heoi2013]Alo 可持久化trie
- HDU-5801 可持久化Trie树
- HDU 4757 可持久化trie树
- BZOJ3166 [Heoi2013]Alo 可持久化Trie
- BZOJ 3166 可持久化Trie
- 可持久化01Trie [Heoi2013]Alo
- POJ2104-K-th Number-区间第k大-可持久化线段树/主席树
- [K短路 可持久化堆 最短路径树] JDFZ 2978 第k短路(强)
- POJ 2104 K-th Number 区间第K大,可持久化线段树
- POJ 2104K-th Number(可持久化线段树-求第K大)
- 算法设计与分析笔记之(4):动态规划
- HTML/CSS小知识整理(持续更新)
- 2017 10 07 NOIP2017模拟赛
- 南阳理工OJ 单调递增子序列(二)
- 欧拉函数
- 【XSY1098】第k小 可持久化trie
- 注册 登录界面以及正则的使用
- Java分页功能实现
- 欢迎使用CSDN-markdown编辑器
- BZOJ1249:SGU277 HERO 动态凸包(set)
- 集合的排序及相关知识
- SSM框架全局异常处理的搭建
- 《信息系统开发与管理》——图
- linux命令之curl学习笔记