[主席树]ZOJ2112 && BZOJ1901 Dynamic Rankings
来源:互联网 发布:sql 交 并 编辑:程序博客网 时间:2024/06/05 15:35
题意:n个数,q个询问 (n<=50000, q<=10000)
Q x y z 代表询问[x, y]区间里的第z小的数
C x y 代表将(从左往右数)第x个数变成y
转自:http://www.cnblogs.com/Empress/p/4659824.html
#include <bits/stdc++.h>using namespace std;typedef long long LL;#define lson l, m#define rson m+1, rconst int N=60005;int a[N], Hash[N];int T[N], L[N<<5], R[N<<5], sum[N<<5];int S[N];int n, m, tot;struct node{ int l, r, k; bool Q;}op[10005];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);}int use[N];void add(int x, int pos, int val){ while(x<=n) { S[x]=update(S[x], 1, m, pos, val); x+=lowbit(x); }}int Sum(int x){ int ret=0; while(x>0) { ret+=sum[L[use[x]]]; x-=lowbit(x); } return ret;}int query(int u, int v, int lr, int rr, int l, int r, int k){ if(l>=r) return l; int m=(l+r)>>1; int tmp=Sum(v)-Sum(u)+sum[L[rr]]-sum[L[lr]]; if(tmp>=k) { for(int i=u;i;i-=lowbit(i)) use[i]=L[use[i]]; for(int i=v;i;i-=lowbit(i)) use[i]=L[use[i]]; return query(u, v, L[lr], L[rr], lson, k); } else { for(int i=u;i;i-=lowbit(i)) use[i]=R[use[i]]; for(int i=v;i;i-=lowbit(i)) use[i]=R[use[i]]; return query(u, v, R[lr], R[rr], rson, k-tmp); }}void modify(int x, int p, int d){ while(x<=n) { S[x]=update(S[x], 1, m, p, d); x+=lowbit(x); }}int main(){ int t; scanf("%d", &t); while(t--) { int q; scanf("%d%d", &n, &q); tot=0; m=0; for(int i=1;i<=n;i++) { scanf("%d", &a[i]); Hash[++m]=a[i]; } for(int i=0;i<q;i++) { char s[10]; scanf("%s", s); if(s[0]=='Q') { scanf("%d%d%d", &op[i].l, &op[i].r, &op[i].k); op[i].Q=1; } else { scanf("%d%d", &op[i].l, &op[i].r); op[i].Q=0; Hash[++m]=op[i].r; } } sort(Hash+1, Hash+1+m); int mm=unique(Hash+1, Hash+1+m)-Hash-1; m=mm; T[0]=build(1, m); for(int i=1;i<=n;i++) T[i]=update(T[i-1], 1, m, lower_bound(Hash+1, Hash+1+m, a[i])-Hash, 1); for(int i=1;i<=n;i++) S[i]=T[0]; for(int i=0;i<q;i++) { if(op[i].Q) { 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, m, op[i].k)]); } else { modify(op[i].l, lower_bound(Hash+1, Hash+1+m, a[op[i].l])-Hash, -1); modify(op[i].l, lower_bound(Hash+1, Hash+1+m, op[i].r)-Hash, 1); a[op[i].l]=op[i].r; } } } return 0;}
阅读全文
0 0
- [主席树]ZOJ2112 && BZOJ1901 Dynamic Rankings
- 【树状数组+主席树】BZOJ1901 [ZOJ2112]Dynamic Rankings
- [BZOJ1901][ZOJ2112]Dynamic Rankings-带修改的主席树-树状数组
- zoj2112 Dynamic Rankings (主席树 || 树套树)
- 【bzoj1901】【Dynamic Rankings】【动态主席树】
- [BZOJ1901]Dynamic Rankings(动态主席树)
- [BZOJ1901]Dynamic Rankings(动态主席树)
- zoj2112--Dynamic Rankings(树状数组+主席树)
- 【ZOJ2112】Dynamic Rankings-树状数组套主席树+离散化
- 【ZOJ2112】Dynamic Rankings 树状数组套主席树
- ZOJ2112-Dynamic Rankings(树状数组套主席树)
- 【bzoj1901】Zju2112 Dynamic Rankings 树状数组套主席树
- 【BZOJ1901】Dynamic Rankings,树状数组套主席树
- [BZOJ1901]Zju2112 Dynamic Rankings(树状数组套主席树)
- bzoj1901 Zju2112 Dynamic Rankings(主席树+树状数组)
- 【ZOJ2112】Dynamic Ranking(主席树)
- [ZOJ2112][可持久化线段树(主席树)][树状数组]Dynamic Rankings[好题]
- 【BZOJ1901】Zju2112 Dynamic Rankings【树状数组套主席树 / 整体二分】
- Android中SharedPreferences的理解
- 基于ubuntu16.04的android开发环境搭建(很全,包括qq的安装)
- C++获取字符cin,getchar,get,getline的区别(转载)
- Leetcode100题
- 2017.10.16 LeetCode 数论小知识
- [主席树]ZOJ2112 && BZOJ1901 Dynamic Rankings
- 背景图片固定位置
- 23种设计模式之单例模式
- city-picker根据县区代码初始化
- linux-sys_Makefile
- hbase-rowkey设计
- 5. tensorflow之tf.random_normal_initializer
- Cannot change version project facet Dynamic web Module 2 5
- InternalError:当前程序已经使用了Windows管理器对象的系统允许的所有句柄