zoj 2112 Dynamic Rankings (动态主席树)
来源:互联网 发布:好的翻译软件 编辑:程序博客网 时间:2024/06/04 19:16
/*Q x y z 代表询问[x, y]区间里的第z小的数C x y 代表将(从左往右数)第x个数变成y*/#include <stdio.h>#include <algorithm>#include <iostream>#include <string.h>using namespace std;# define lson l,m# define rson m+1,r# define N 60010int a[N],Hash[N],T[N],S[N];int tot;int L[N<<5],R[N<<5],sum[N<<5];int use[N];struct node{ int l,r,k; int flag;};node op[N];int size;int n;int build(int l,int r){ int rt=(++tot); sum[rt]=0; if(l<r) { int m=(l+r)>>1; L[rt]=build(lson); R[rt]=build(rson); } return rt;}int update(int pre,int l,int r,int x,int val){ int rt=(++tot); L[rt]=L[pre]; R[rt]=R[pre]; sum[rt]=sum[pre]+val; if(l<r) { int m=(l+r)>>1; if(x<=m) L[rt]=update(L[pre],lson,x,val); else R[rt]=update(R[pre],rson,x,val); } return rt;}int lowbit(int x){ return x&(-x);}void add(int x,int pos,int val){ while(x<=n) { S[x]=update(S[x],1,size,pos,val); x+=lowbit(x); }}int getSum(int x){ int ret=0; while(x>0) { ret+=sum[L[use[x]]]; x-=lowbit(x); } return ret;}void modify(int x,int p,int val){ while(x<=n) { S[x]=update(S[x],1,size,p,val); x+=lowbit(x); }}int query(int u,int v,int lr,int rr,int l,int r,int k){ int i; if(l>=r) return l; int m=(l+r)>>1; int tmp=getSum(v)-getSum(u)+sum[L[rr]]-sum[L[lr]]; if(tmp>=k) { for(i=u; i; i-=lowbit(i)) use[i]=L[use[i]]; for(i=v; i; i-=lowbit(i)) use[i]=L[use[i]]; return query(u,v,L[lr],L[rr],lson,k); } else { for(i=u; i; i-=lowbit(i)) use[i]=R[use[i]]; for(i=v; i; i-=lowbit(i)) use[i]=R[use[i]]; return query(u,v,R[lr],R[rr],rson,k-tmp); }}int main(){ int t,q,i,j; while(~scanf("%d",&t)) { while(t--) { tot=0; scanf("%d%d",&n,&q); int m=0; for(i=1; i<=n; i++) { scanf("%d",&a[i]); Hash[m++]=a[i]; } for(i=1; i<=q; i++) { char str[10]; scanf("%s",&str); if(str[0]=='Q') { scanf("%d%d%d",&op[i].l,&op[i].r,&op[i].k); op[i].flag=0; } else { scanf("%d%d",&op[i].l,&op[i].r); op[i].flag=1; Hash[m++]=op[i].r; } } sort(Hash,Hash+m); size=unique(Hash,Hash+m)-Hash; T[0]=build(1,size); for(i=1; i<=n; i++) { int x=lower_bound(Hash,Hash+size,a[i])-Hash; T[i]=update(T[i-1],1,size,x,1); } for(i=1; i<=n; i++) S[i]=T[0]; for(i=1; i<=q; i++) { if(op[i].flag)//修改 { modify(op[i].l,lower_bound(Hash,Hash+size,a[op[i].l])-Hash,-1); modify(op[i].l,lower_bound(Hash,Hash+size,op[i].r)-Hash,1); a[op[i].l]=op[i].r; } else { for(int j=op[i].l-1; j; j-=lowbit(j)) use[j]=S[j]; for(int j=op[i].r; j; j-=lowbit(j)) use[j]=S[j]; printf("%d\n",Hash[query(op[i].l-1,op[i].r,T[op[i].l-1],T[op[i].r],1,size,op[i].k)]); } } } } return 0;}
0 0
- zoj 2112 Dynamic Rankings (动态主席树)
- zoj 2112 Dynamic Rankings(主席树&动态第k大)
- zoj-2112-Dynamic Rankings主席树模板
- ZOJ 2112 Dynamic Rankings(主席树-动态第k大)
- ZOJ 2112 Dynamic Rankings 树状数组套主席树 动态第K大
- ZOJ 2112 Dynamic Rankings (动态第k大,树状数组套主席树)★★
- ZOJ 2112 Dynamic Rankings (动态第k大,树状数组套主席树)
- zoj 2112 Dynamic Rankings(动态第k大,树状数组套主席树)
- ZOJ 2112 Dynamic Rankings(树状数组套主席树)
- ZOJ 2112 Dynamic Rankings [树状数组套主席树]
- ZOJ 2112-Dynamic Rankings (树状数组+主席树)
- 【bzoj1901】【Dynamic Rankings】【动态主席树】
- [BZOJ1901]Dynamic Rankings(动态主席树)
- [BZOJ1901]Dynamic Rankings(动态主席树)
- [BZOJ 1901][ZOJ 2112]Dynamic Rankings(树状数组套主席树、动态区间第k大值查询)
- ZOJ 2112 Dynamic Rankings 树状数组套主席树 单点修改求动态区间第K大
- ZOJ 2112 Dynamic Rankings(主席树套树状数组+静态主席树)
- bzoj 1901 ZOJ 2112 Dynamic Rankings [树状数组套主席树] [线段树套平衡树]
- Android学习心得(9) --- ndk-build脚本参数用法
- 如何理解php中命名空间概念
- Redis 和 Jedis
- android+Python socket
- CMD网络命令
- zoj 2112 Dynamic Rankings (动态主席树)
- java编写二叉树以及前序遍历、中序遍历和后序遍历
- win7下使用共享内存方式CreateFileMapping返回GetLastError总是0x5的问题解决
- objectARX错误处理函数
- 什么是流媒体技术
- C语言分支结构语句if-else语句
- 学习笔记:linuxc第七章—进程控制 下篇
- VC 修改窗口属性
- Climbing Stairs