动态求区间K大值(权值线段树)
我们知道我们可以通过主席树来维护静态区间第K大值。我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做。
我们注意到树状数组的每一棵树都和前一颗树没有关系,so,并不需要可持久化,一个朴素的权值线段树就可以啦。
我们知道普通的线段树是刚开始就把所有的节点都开了,但我们发现并不需要,因为每个点里的操作并不是很多,很大一部分的节点是用不到的,那么我们就可以不开。用Ls 和 Rs 来记左右儿子的地址,随用随开即可。
- #include<bits/stdc++.h>
- #define N 100005
- #define mid ((l+r)>>1)
- using namespace std;
- inline int lowbit(int x){return x&-x;}
- int n,m,sz,totn,totx,toty,a[N],b[N<<],ca[N],cb[N],cc[N];
- int xx[N],yy[N],rt[N],size[*N],ls[*N],rs[*N];
- void ins(int l,int r,int x,int q,int v){
- size[x]+=v;
- if (l==r) return;
- if (q<=mid) { if (!ls[x]) ls[x]=++sz; ins(l,mid,ls[x],q,v);
- } else { if (!rs[x]) rs[x]=++sz; ins(mid+,r,rs[x],q,v);
- }
- }
- int query(int l,int r,int q){
- if(l==r)return l; int sum=;
- for(int i=;i<=totx;i++)sum-=size[ls[xx[i]]];
- for(int i=;i<=toty;i++)sum+=size[ls[yy[i]]];
- if(q<=sum){
- for(int i=;i<=totx;i++)xx[i]=ls[xx[i]];
- for(int i=;i<=toty;i++)yy[i]=ls[yy[i]];
- return query(l,mid,q);
- }
- else{
- for(int i=;i<=totx;i++)xx[i]=rs[xx[i]];
- for(int i=;i<=toty;i++)yy[i]=rs[yy[i]];
- return query(mid+,r,q-sum);
- }
- }
- void add(int x,int v){
- int k=lower_bound(b+,b+totn+,a[x])-b;
- for(int i=x;i<=n;i+=lowbit(i))ins(,totn,rt[i],k,v);
- }
- inline int read(){
- int f=,x=;char ch;
- do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
- do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
- return f*x;
- }
- int main(){char s[];
- n=read();m=read();
- for(int i=;i<=n;i++)a[i]=read(),b[++totn]=a[i];
- for(int i=;i<=m;i++){
- scanf("%s",s);ca[i]=read();cb[i]=read();
- if(s[]=='')cc[i]=read();else b[++totn]=cb[i];
- }
- sort(b+,b+totn+);
- totn=unique(b+,b+totn+)-b-;
- for (int i=;i<=n;i++) rt[i]=i; sz=n;
- for(int i=;i<=n;i++)add(i,);
- for(int i=;i<=m;i++){
- if(cc[i]){
- totx=toty=;
- for(int j=ca[i]-;j;j-=lowbit(j))xx[++totx]=rt[j];
- for(int j=cb[i];j;j-=lowbit(j))yy[++toty]=rt[j];
- printf("%d\n",b[query(,totn,cc[i])]);
- }
- else{add(ca[i],-);a[ca[i]]=cb[i];add(ca[i],);}
- }
- }
就酱紫。
动态求区间K大值(权值线段树)的更多相关文章
- BZOJ 1901: Zju2112 Dynamic Rankings 区间k大 带修改 在线 线段树套平衡树
之前写线段树套splay数组版..写了6.2k..然后弃疗了.现在发现还是很水的..嘎嘎.. zju过不了,超时. upd:才发现zju是多组数据..TLE一版才发现.然后改了,MLE...手写内存池 ...
- HDU1166(线段树 +更新单点,求区间总和)、HDU1754(线段树 + 更新单点,求区间最大值)
线段树简单应用 先附上几张图便与理解,大佬文章传送门1.传送门2 HDU1166:题目描述 线段树 +更新单点,求区间总和 代码如下(递归版) #include<iostream> #in ...
- POJ 2104 K-th Number ( 求取区间 K 大值 || 主席树 || 离线线段树)
题意 : 给出一个含有 N 个数的序列,然后有 M 次问询,每次问询包含 ( L, R, K ) 要求你给出 L 到 R 这个区间的第 K 大是几 分析 : 求取区间 K 大值是个经典的问题,可以使用 ...
- zoj 2112 动态区间求第k大
题目大意: 动态单点更新,然后多次询问求区间内第k大 这里单个的主席树不能实现,这里采取的是树状数组套主席树 首先可以想的是将静态主席树先构建好,不去动它,这里空间复杂度就是O(nlogn),这个只要 ...
- [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)
[BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...
- 堆实战(动态数据流求top k大元素,动态数据流求中位数)
动态数据集合中求top k大元素 第1大,第2大 ...第k大 k是这群体里最小的 所以要建立个小顶堆 只需要维护一个大小为k的小顶堆 即可 当来的元素(newCome)> 堆顶元素(small ...
- 两个有序数组中的中位数以及求第k个最小数的值
解法参考 <[分步详解]两个有序数组中的中位数和Top K问题> https://blog.csdn.net/hk2291976/article/details/51107778 里面求中 ...
- BZOJ2006:超级钢琴(ST表+堆求前K大区间和)
Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度 ...
- poj2104 划分树 区间K大 在线 无修改
博主sbit....对于高级数据结构深感无力,然后这些东西在OI竟然烂大街了,不搞就整个人都不好了呢. 于是我勇猛的跳进了这个大坑 ——sbit 区间K大的裸题,在线,无修改. 可以用归并树(\(O( ...
随机推荐
- 【NOIP2003提高组】加分二叉树
https://www.luogu.org/problem/show?pid=1040 令f(i,j)表示[i,j]的二叉树中最高的分数.枚举k为根,状转方程:f(i,j)=max{f(i,k-1)* ...
- 遍历输出tuple元素的简洁方式(C++11)
//遍历输出tuple元素的简洁方式(C++11) //Win32Con17_VS2017_01.cpp #include <iostream> #include <tuple> ...
- 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:/ ...
- 读《淘宝技术这十年》 总结下web架构的发展
关键词就两 分布式 缓存 分布式 数据库,应用服务器等的多节点部署,数据库的读写分离,剥离文件系统 缓存 数据缓存 静态页面缓存 php时代 最初LAMP起步 并将数据库做读写分离,拆分为主库+从库 ...
- svn 批量加入没有加入版本号控制的文件命令
svn st | awk '{if($1=="?"){print$2}}'|xargs svn add
- java多线程编程核心技术——第六章总结
目录 1.0立即加载/"饿汉式" 2.0延迟加载/"懒汉式" 3.0使用静态内置类实现单例模式 4.0序列化与反序列化的单例模式实现 5.0使用static代码 ...
- Spring依赖注入原理
接触过spring 的同学应该都知道依赖注入,依赖注入又称控制反转,其内涵就是,将创建某个bean的控制权力,由原来需要引用这个bean的bean转移(反转)到外部的spring IOC容器,由IOC ...
- MPSOC之1——overview、开发板、工具
1.MPSOC overview MPSOC是xilinx公司推出的新一代集成SOC,比ZYNQ厉害了一个等级. 熟悉一个芯片,不能一头扎进详细的数据手册,应该从overview开始大概了解,然后浏览 ...
- Selenium Python 安装指导
最近无聊.又重新装了个selenium 果然时代变了.安装的时候的方法和以前不太一样了.因此觉得有必要单列出来加以说明 另外备注:测试小伙伴们.安装此类工具报错.尝试以下两个方案之一: 1.请转sta ...
- nginx转发tomcat请求转成https后页面不能下载apk文件而是直接打开
访问域名下面的apk文件 https://xxxx/xxx.apk 浏览器没有下载而是直接打开了文件 没有找到问题原因,可能是https的原因,要是用http就可以下载,转发https就有问题 后来是 ...