我们知道我们可以通过主席树来维护静态区间第K大值。我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做。

我们注意到树状数组的每一棵树都和前一颗树没有关系,so,并不需要可持久化,一个朴素的权值线段树就可以啦。

我们知道普通的线段树是刚开始就把所有的节点都开了,但我们发现并不需要,因为每个点里的操作并不是很多,很大一部分的节点是用不到的,那么我们就可以不开。用Ls 和 Rs 来记左右儿子的地址,随用随开即可。

  1. #include<bits/stdc++.h>
  2. #define N 100005
  3. #define mid ((l+r)>>1)
  4. using namespace std;
  5. inline int lowbit(int x){return x&-x;}
  6. int n,m,sz,totn,totx,toty,a[N],b[N<<],ca[N],cb[N],cc[N];
  7. int xx[N],yy[N],rt[N],size[*N],ls[*N],rs[*N];
  8. void ins(int l,int r,int x,int q,int v){
  9. size[x]+=v;
  10. if (l==r) return;
  11. if (q<=mid) { if (!ls[x]) ls[x]=++sz; ins(l,mid,ls[x],q,v);
  12. } else { if (!rs[x]) rs[x]=++sz; ins(mid+,r,rs[x],q,v);
  13. }
  14. }
  15. int query(int l,int r,int q){
  16. if(l==r)return l; int sum=;
  17. for(int i=;i<=totx;i++)sum-=size[ls[xx[i]]];
  18. for(int i=;i<=toty;i++)sum+=size[ls[yy[i]]];
  19. if(q<=sum){
  20. for(int i=;i<=totx;i++)xx[i]=ls[xx[i]];
  21. for(int i=;i<=toty;i++)yy[i]=ls[yy[i]];
  22. return query(l,mid,q);
  23. }
  24. else{
  25. for(int i=;i<=totx;i++)xx[i]=rs[xx[i]];
  26. for(int i=;i<=toty;i++)yy[i]=rs[yy[i]];
  27. return query(mid+,r,q-sum);
  28. }
  29. }
  30. void add(int x,int v){
  31. int k=lower_bound(b+,b+totn+,a[x])-b;
  32. for(int i=x;i<=n;i+=lowbit(i))ins(,totn,rt[i],k,v);
  33. }
  34. inline int read(){
  35. int f=,x=;char ch;
  36. do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
  37. do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
  38. return f*x;
  39. }
  40. int main(){char s[];
  41. n=read();m=read();
  42. for(int i=;i<=n;i++)a[i]=read(),b[++totn]=a[i];
  43. for(int i=;i<=m;i++){
  44. scanf("%s",s);ca[i]=read();cb[i]=read();
  45. if(s[]=='')cc[i]=read();else b[++totn]=cb[i];
  46. }
  47. sort(b+,b+totn+);
  48. totn=unique(b+,b+totn+)-b-;
  49. for (int i=;i<=n;i++) rt[i]=i; sz=n;
  50. for(int i=;i<=n;i++)add(i,);
  51. for(int i=;i<=m;i++){
  52. if(cc[i]){
  53. totx=toty=;
  54. for(int j=ca[i]-;j;j-=lowbit(j))xx[++totx]=rt[j];
  55. for(int j=cb[i];j;j-=lowbit(j))yy[++toty]=rt[j];
  56. printf("%d\n",b[query(,totn,cc[i])]);
  57. }
  58. else{add(ca[i],-);a[ca[i]]=cb[i];add(ca[i],);}
  59. }
  60. }

就酱紫。

动态求区间K大值(权值线段树)的更多相关文章

  1. BZOJ 1901: Zju2112 Dynamic Rankings 区间k大 带修改 在线 线段树套平衡树

    之前写线段树套splay数组版..写了6.2k..然后弃疗了.现在发现还是很水的..嘎嘎.. zju过不了,超时. upd:才发现zju是多组数据..TLE一版才发现.然后改了,MLE...手写内存池 ...

  2. HDU1166(线段树 +更新单点,求区间总和)、HDU1754(线段树 + 更新单点,求区间最大值)

    线段树简单应用 先附上几张图便与理解,大佬文章传送门1.传送门2 HDU1166:题目描述 线段树 +更新单点,求区间总和 代码如下(递归版) #include<iostream> #in ...

  3. POJ 2104 K-th Number ( 求取区间 K 大值 || 主席树 || 离线线段树)

    题意 : 给出一个含有 N 个数的序列,然后有 M 次问询,每次问询包含 ( L, R, K ) 要求你给出 L 到 R 这个区间的第 K 大是几 分析 : 求取区间 K 大值是个经典的问题,可以使用 ...

  4. zoj 2112 动态区间求第k大

    题目大意: 动态单点更新,然后多次询问求区间内第k大 这里单个的主席树不能实现,这里采取的是树状数组套主席树 首先可以想的是将静态主席树先构建好,不去动它,这里空间复杂度就是O(nlogn),这个只要 ...

  5. [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)

    [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...

  6. 堆实战(动态数据流求top k大元素,动态数据流求中位数)

    动态数据集合中求top k大元素 第1大,第2大 ...第k大 k是这群体里最小的 所以要建立个小顶堆 只需要维护一个大小为k的小顶堆 即可 当来的元素(newCome)> 堆顶元素(small ...

  7. 两个有序数组中的中位数以及求第k个最小数的值

    解法参考 <[分步详解]两个有序数组中的中位数和Top K问题> https://blog.csdn.net/hk2291976/article/details/51107778 里面求中 ...

  8. BZOJ2006:超级钢琴(ST表+堆求前K大区间和)

    Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度 ...

  9. poj2104 划分树 区间K大 在线 无修改

    博主sbit....对于高级数据结构深感无力,然后这些东西在OI竟然烂大街了,不搞就整个人都不好了呢. 于是我勇猛的跳进了这个大坑 ——sbit 区间K大的裸题,在线,无修改. 可以用归并树(\(O( ...

随机推荐

  1. 【NOIP2003提高组】加分二叉树

    https://www.luogu.org/problem/show?pid=1040 令f(i,j)表示[i,j]的二叉树中最高的分数.枚举k为根,状转方程:f(i,j)=max{f(i,k-1)* ...

  2. 遍历输出tuple元素的简洁方式(C++11)

    //遍历输出tuple元素的简洁方式(C++11) //Win32Con17_VS2017_01.cpp #include <iostream> #include <tuple> ...

  3. maven jetty struts异常 There is no Action mapped for namespace [/] and action name [] associated with context path

    毕业设计中用maven jetty插件调试时,struts出现这个错误,直接http://localhost:8080 无法进入默认主页,但换tomcat就没问题,最后在这篇文章找到答案 http:/ ...

  4. 读《淘宝技术这十年》 总结下web架构的发展

    关键词就两 分布式 缓存 分布式 数据库,应用服务器等的多节点部署,数据库的读写分离,剥离文件系统 缓存 数据缓存 静态页面缓存 php时代 最初LAMP起步 并将数据库做读写分离,拆分为主库+从库 ...

  5. svn 批量加入没有加入版本号控制的文件命令

    svn st | awk '{if($1=="?"){print$2}}'|xargs svn add

  6. java多线程编程核心技术——第六章总结

    目录 1.0立即加载/"饿汉式" 2.0延迟加载/"懒汉式" 3.0使用静态内置类实现单例模式 4.0序列化与反序列化的单例模式实现 5.0使用static代码 ...

  7. Spring依赖注入原理

    接触过spring 的同学应该都知道依赖注入,依赖注入又称控制反转,其内涵就是,将创建某个bean的控制权力,由原来需要引用这个bean的bean转移(反转)到外部的spring IOC容器,由IOC ...

  8. MPSOC之1——overview、开发板、工具

    1.MPSOC overview MPSOC是xilinx公司推出的新一代集成SOC,比ZYNQ厉害了一个等级. 熟悉一个芯片,不能一头扎进详细的数据手册,应该从overview开始大概了解,然后浏览 ...

  9. Selenium Python 安装指导

    最近无聊.又重新装了个selenium 果然时代变了.安装的时候的方法和以前不太一样了.因此觉得有必要单列出来加以说明 另外备注:测试小伙伴们.安装此类工具报错.尝试以下两个方案之一: 1.请转sta ...

  10. nginx转发tomcat请求转成https后页面不能下载apk文件而是直接打开

    访问域名下面的apk文件 https://xxxx/xxx.apk 浏览器没有下载而是直接打开了文件 没有找到问题原因,可能是https的原因,要是用http就可以下载,转发https就有问题 后来是 ...