【可持久化线段树】【树状数组】[ZOJ 2112]Dynamic Rankings
2015-11-27 14:01
190 查看
题目大意:带修改操作的区间第K大
首先可以发现因为只有在需要使用的时候才会新建节点那么最多有nlognnlogn个节点,那么只需要在更新的时候带上值域就可以不用进行离散化了,每一次就是和普通的树状数组那么进行更新,因为求得是区间的和(大概就是可持久化的原理)但是用树状数组来做每一个更新的时候就有了求前缀和的范围,每一次加起来就好了,其实和普通的树状数组差不多的。(注意是多组数据)
首先可以发现因为只有在需要使用的时候才会新建节点那么最多有nlognnlogn个节点,那么只需要在更新的时候带上值域就可以不用进行离散化了,每一次就是和普通的树状数组那么进行更新,因为求得是区间的和(大概就是可持久化的原理)但是用树状数组来做每一个更新的时候就有了求前缀和的范围,每一次加起来就好了,其实和普通的树状数组差不多的。(注意是多组数据)
[code]#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 500000; const int INF = 1e9+7; struct node{ int ch[2]; int sum; }pool[20000000]; int roots[MAXN+10], n, m, tot; int lowbit(int u){return (u&(-u));} void Insert(int &u, int l, int r, int v, int k){ ++tot; pool[tot] = pool[u]; u = tot; pool[u].sum += k; if(l == r) return ; int mid = (l + r) >> 1; if(v <= mid) Insert(pool[u].ch[0], l, mid, v, k); else Insert(pool[u].ch[1], mid+1, r, v, k); } void Update(int u, int v, int k){ while(u <= n){ Insert(roots[u], -INF, INF, v, k); u += lowbit(u); } } int troots[MAXN+10], rcnt, lcnt; void Q(int u){ while(u > 0){ troots[++rcnt] = roots[u]; u -= lowbit(u); } } int A[MAXN+10]; int Query(int l, int r, int k){ if(l >= r) return l; int cz = 0; for(int i=1;i<=lcnt;i++) cz += pool[pool[troots[i]].ch[0]].sum; for(int i=lcnt+1;i<=rcnt;i++) cz -= pool[pool[troots[i]].ch[0]].sum; int mid = (l + r) >> 1; if(k <= cz){ for(int i=1;i<=rcnt;i++) troots[i] = pool[troots[i]].ch[0]; return Query(l, mid, k); } for(int i=1;i<=rcnt;i++) troots[i] = pool[troots[i]].ch[1]; return Query(mid+1, r, k-cz); } int main(){ scanf("%d%d", &n, &m); for(int i=1;i<=n;i++){ scanf("%d", &A[i]); Update(i, A[i], 1); } char s[10]; int t1, t2, t3; for(int i=1;i<=m;i++){ scanf("%s", s); if(s[0] == 'C'){ scanf("%d%d", &t1, &t2); Update(t1, A[t1], -1); A[t1] = t2; Update(t1, A[t1], 1); }else{ scanf("%d%d%d", &t1, &t2, &t3); rcnt = 0; Q(t2); lcnt = rcnt; Q(t1-1); printf("%d\n", Query(-INF, INF, t3)); } } return 0; }
相关文章推荐
- Java NIO (十) DatagramChannel
- 委托的invoke、beginInvoke和控件的invoke、beginInvoke的区别
- virtualbox安装window8需要注意的地方
- test
- php MySQL与MongoDB的对比
- MYSQL查询大小写是否敏感问题分析
- Javascript] Object,(Date)
- CSDN第一篇博客
- mac 电脑有关 操作(删除废弃喽文件)
- 1077. Kuchiguse (20)
- 初试2048
- java set转list,数组与list的转换
- 可持久化Trie树初步
- iOS学习笔记:神奇的IB_DESIGNABLE和IBInspectable
- 随手写个网络通讯情况监控“微系统”
- 1069. The Black Hole of Numbers (20)
- Python安装配置
- 如何将一个已经编译好的service的bin档/jar文件编译进system/bin目录下
- Deployment failed because of an internal error: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]
- Spring Quartz实现定时任务的配置方法