Time:2016.05.09
Author:xiaoyimi
转载注明出处谢谢


传送门(权限)


题面
1901: Zju2112 Dynamic Rankings

Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 6678 Solved: 2777
[Submit][Status][Discuss]
Description

给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令。对于每一个询问指令,你必须输出正确的回答。 第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。分别表示序列的长度和指令的个数。第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。接下来的m行描述每条指令,每行的格式是下面两种格式中的一种。 Q i j k 或者 C i t Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t。

Input

对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。

Output

Sample Input

5 3

3 2 1 4 7

Q 1 4 3

C 2 6

Q 2 5 3

Sample Output

3

6

HINT

20%的数据中,m,n≤100; 40%的数据中,m,n≤1000; 100%的数据中,m,n≤10000。


思路:
树状数组套主席树
一直纠结是前缀建树还是套用树状数组建树,和小恐龙、DaD3zZ讨论了好久(被批评为纠结没有用的东西),看了好几个人的模版都感觉不爽,最后还是觉得黄学长的比较舒服
注意:
每一次的修改实际上就是新生成了一颗主席树,因此代表着序列中对应元素的主席树也是不断在更新的,所以要开一个数组实时记录各元素对应主席树的根
代码:

#include<bits/stdc++.h>
#define M 20004
#define ls(x) a[x].ch[0]
#define rs(x) a[x].ch[1]
#define low(x) (x&(-x))
using namespace std;
int n,m,tot,cnt;
int c[M>>1],ID[M],S1[M],S2[M],root[M];
struct Ask
{int x,y,k;bool opt;
}q[M>>1];
struct disc
{int data,id;bool operator <(const disc other)const{return data<other.data;}
}b[M];
struct Chairman_tree
{int siz,ch[2];
}a[M*250];
int build(int now,int L,int R,int k,int val)
{int rt=++cnt;a[rt].siz=a[now].siz+k;ls(rt)=ls(now);rs(rt)=rs(now);if (L==R) return rt;int mid=(L+R)>>1;if (mid>=val)ls(rt)=build(ls(now),L,mid,k,val);elsers(rt)=build(rs(now),mid+1,R,k,val);return rt;
}
int get(int begin,int end,int k)
{if (begin==end) return end;int mid=(begin+end)>>1,t=0;for (int i=1;i<=S1[0];i++) t-=a[ls(S1[i])].siz;for (int i=1;i<=S2[0];i++) t+=a[ls(S2[i])].siz;if (k<=t){for (int i=1;i<=S1[0];i++) S1[i]=ls(S1[i]);for (int i=1;i<=S2[0];i++) S2[i]=ls(S2[i]);return get(begin,mid,k);}else{for (int i=1;i<=S1[0];i++) S1[i]=rs(S1[i]);for (int i=1;i<=S2[0];i++) S2[i]=rs(S2[i]);return get(mid+1,end,k-t);}
}
main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)scanf("%d",c+i),b[i].id=i,b[i].data=c[i];int x,y;tot=n;for (int i=1;i<=m;i++){char ch=getchar();while (ch!='Q'&&ch!='C') ch=getchar();scanf("%d%d",&q[i].x,&q[i].y);if (ch=='C')q[i].opt=1,b[++tot].id=i+n,b[tot].data=q[i].y;else scanf("%d",&q[i].k);}sort(b+1,b+tot+1);for (int i=1;i<=tot;i++){ID[i]=b[i].data;if (b[i].id>n) q[b[i].id-n].y=i;else c[b[i].id]=i;}root[0]=++cnt;for (int i=1;i<=n;i++)for (int j=i;j<=n;j+=low(j))root[j]=build(root[j],1,tot,1,c[i]);for (int i=1;i<=m;i++){if (!q[i].opt){S1[0]=0;S2[0]=0;for (int j=q[i].x-1;j;j-=low(j)) S1[++S1[0]]=root[j];for (int j=q[i].y;j;j-=low(j)) S2[++S2[0]]=root[j];printf("%d\n",ID[get(1,tot,q[i].k)]);}else{for (int j=q[i].x;j<=n;j+=low(j))root[j]=build(root[j],1,tot,-1,c[q[i].x]);c[q[i].x]=q[i].y;for (int j=q[i].x;j<=n;j+=low(j))root[j]=build(root[j],1,tot,1,c[q[i].x]);}}
}

【BZOJ1901】Dynamic Rankings,树状数组套主席树相关推荐

  1. H - Hello Ms. Ze(树状数组套主席树,线段树上二分)

    H - Hello Ms. Ze 给定nnn种不同的材料,第iii种材料有aia_iai​个,有mmm个操作,操作分为两类: 把第xxx种材料修改为yyy个, 只用[l,r][l, r][l,r]区间 ...

  2. ICPC 徐州 H Yuuki and a problem (树状数组套主席树)

    Yuuki and a problem 先不管第一问的修改操作,考虑如何达到第二问的查询操作, 题目要我们给出一个区间[l,r][l, r][l,r]中,不能通过权值+++得到的最小的数字是什么, 假 ...

  3. #279. [SYZOI Round1] 滑稽♂树(树状数组套主席树)

    #279. [SYZOI Round1] 滑稽♂树 子树上的问题,考虑dfsdfsdfs序,第kkk大,可以用主席树嘛,支持修改,那就树状数组上套主席树,参考P4175 [CTSC2008]网络管理( ...

  4. zoj 2112 树状数组 套主席树 动态求区间 第k个数

    总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...

  5. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

  6. BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...

  7. BZOJ1901 Zju2112 Dynamic Rankings 【树状数组套主席树】

    题目 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k≤j- ...

  8. BZOJ1901Zju2112 Dynamic Rankings——树状数组套主席树

    题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1 ],a[i+2]--a[j]中第k小的数是多少(1≤k ...

  9. 洛谷 - P2617 Dynamic Rankings(树状数组套主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,再给出 m 次操作: Q l r k:返回区间 [ l , r ] 内第 k 大的数 C x y:令 a[ x ] = y 题目分析:其实 ...

最新文章

  1. BigDecimal去除末尾多余的0
  2. java shiro原理_Springboot shiro认证授权实现原理及实例
  3. 如何使用Marketing Cloud的扩展字段作为搜索条件进行搜索
  4. 2016专接本c语言真题_云南特岗教师考试真题(中学信息技术)9套(无答案)
  5. 数据科学 IPython 笔记本 7.11 聚合和分组
  6. python字符串_Python的字符串和编码
  7. vmware workstation中Linux虚拟机固定IP
  8. Hystrix监控数据聚合
  9. BeEF-XSS详细使用教程
  10. Asynchronous FIFO with gray code(异步FIFO verilog设计理念)
  11. message: 没有找到可以构建的 NPM 包,请确认需要参与构建的 npm 都在 `miniprogramRoot` 目录内,或配置 project.config.json 的 packNpmMa
  12. 电子电路:差分放大器分析
  13. 在一个app中启动另外一个app的service
  14. Assimp库调用mtl加载obj模型
  15. python123创意绘画_Turtle 创意绘画
  16. 走出舒适圈,你才能看到更广袤的世界
  17. Python使用scapy和dpkt抓包并解析
  18. 一个动态ACL的案例
  19. 领扣LintCode问题答案-57. 三数之和
  20. java sinh_java.lang.Math.sinh(double x)方法实例

热门文章

  1. 【ModelArts-Lab AI实战营】使用Postman测试Modelarts在线服务(图像分类、物体检测)
  2. java时间往后一天_如何在Java中将日期增加一天?
  3. mysql 5.7.24没有my.cnf_Linux上安装设置mysql 5.7.24 無玑小姐
  4. java 嵌套类: Nested classes
  5. Android Studio开启虚拟机报错!emulator: ERROR: x86 emulation currently requires hardware acceleration!解决办法梳理
  6. python实例变量命名规则_Java,Python的一些命名规范
  7. CAP定理(CAP theorem)
  8. java 反射调用set方法_java反射调用set方法时如果让参数做自动类型转换
  9. 樊登读书分享ppt_樊登读书精华分享-《分手后,成为更好的自己》
  10. 遇到 oracle 错误 25153,EXP时,出现3113的错误,不知道怎么解决?