可修改的区间第K大 BZOJ1901 ZOJ2112
http://blog.csdn.net/u014492306/article/details/47981315 //变相离线做法
离散化缩小区间范围,做两大个线段树,第一个就是普通的持久化树,有个前缀和就好。
第二个用线段树套树状数组,每次询问就把这两个都求出来加一下。
更改就更改第二个,其实更改的时候只需要建一条链然后重复用这条链衍生就好了,但是为了抄的方便,就不改了。。。
当然这个空间上比较优秀的只有O(nlogn).
#include<bits/stdc++.h>
#define lowbit(x) (x&(-x))
using namespace std;
const int N=6e4+;
const int M=;
int m,n,nn,tot;
int a[N],f[N],T[N],S[N];
int sum[M],l[M],r[M];
int use[N];
int h(int x) {return lower_bound(f+,f+nn+,x)-f;}
void update(int pr,int lx,int rx,int v,int k){
l[++tot]=l[pr],r[tot]=r[pr],sum[tot]=sum[pr]+k;
if(lx==rx) return;
int mid=(lx+rx)>>;
if(v<=mid) l[tot]=tot+,update(l[pr],lx,mid,v,k);
else r[tot]=tot+,update(r[pr],mid+,rx,v,k);
}
int Sum(int x){
int res=;
for(int i=x;i;i-=lowbit(i)) res+=sum[l[use[i]]];
return res;
}
void add(int x,int v,int k){
int temp;
for(int i=x;i<=n;i+=lowbit(i)) {
temp=S[i];
S[i]=tot+;
update(temp,,nn,v,k);
}
}
int query(int L,int R,int k){
for(int i=L-;i;i-=lowbit(i)) use[i]=S[i];
for(int i=R;i;i-=lowbit(i)) use[i]=S[i];
int lx=,rx=nn,lt=T[L-],rt=T[R];
while(lx<rx) {
int mid=(lx+rx)>>;
int tmp=Sum(R)-Sum(L-)+sum[l[rt]]-sum[l[lt]];
if(k<=tmp) {
rx=mid;
for(int i=L-;i;i-=lowbit(i)) use[i]=l[use[i]];
for(int i=R;i;i-=lowbit(i)) use[i]=l[use[i]];
lt=l[lt],rt=l[rt];
}
else {
lx=mid+,k-=tmp;
for(int i=L-;i;i-=lowbit(i)) use[i]=r[use[i]];
for(int i=R;i;i-=lowbit(i)) use[i]=r[use[i]];
lt=r[lt],rt=r[rt];
}
}
return f[lx];
}
char op[];
int q[][],Ta;
int main(){
for(scanf("%d",&Ta);Ta--;) {
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i) scanf("%d",a+i),f[i]=a[i];
nn=n;
for(int i=;i<=m;++i) {
scanf("%s",op);
if(op[]=='Q') {
scanf("%d%d%d",&q[i][],&q[i][],&q[i][]);
q[i][]=;
}
else {
scanf("%d%d",&q[i][],&q[i][]);
q[i][]=;
f[++nn]=q[i][];
}
}
sort(f+,f++nn);
nn=unique(f+,f+nn+)-f-;
tot=,T[]=;
for(int i=;i<=n;++i) T[i]=tot+,update(T[i-],,nn,h(a[i]),);
for(int i=;i<=n;++i) S[i]=;
for(int i=;i<=m;++i) {
if(q[i][]) printf("%d\n",query(q[i][],q[i][],q[i][]));
else {
add(q[i][],h(a[q[i][]]),-);
add(q[i][],h(q[i][]),);
a[q[i][]]=q[i][];
}
}
}
return ;
}
如果强制在线的话,只能一开始就用线段树套树状数组了,空间复杂度O(nlog(1e9)log(1e9)),为什么是1e9是因为你没办法事先离散化,因为你不知道更改的时候他要改成什。
http://blog.sina.com.cn/s/blog_4a0c4e5d0101c3yj.html
可修改的区间第K大 BZOJ1901 ZOJ2112的更多相关文章
- ZOJ -2112 Dynamic Rankings 主席树 待修改的区间第K大
Dynamic Rankings 带修改的区间第K大其实就是先和静态区间第K大的操作一样.先建立一颗主席树, 然后再在树状数组的每一个节点开线段树(其实也是主席树,共用节点), 每次修改的时候都按照树 ...
- ZOJ 2112 Dynamic Rankings(带修改的区间第K大,分块+二分搜索+二分答案)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- POJ2104-- K-th Number(主席树静态区间第k大)
[转载]一篇还算可以的文章,关于可持久化线段树http://finaltheory.info/?p=249 无修改的区间第K大 我们先考虑简化的问题:我们要询问整个区间内的第K大.这样我们对值域建线段 ...
- 主席树区间第K大
主席树的实质其实还是一颗线段树, 然后每一次修改都通过上一次的线段树,来添加新边,使得每次改变就改变logn个节点,很多节点重复利用,达到节省空间的目的. 1.不带修改的区间第K大. HDU-2665 ...
- 【ZOJ2112】【整体二分+树状数组】带修改区间第k大
The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...
- Dynamic Rankings——带修改区间第k大
三种做法:1.整体二分: 二分mid 考虑小于mid的修改的影响 但是大于mid的修改可能会干掉小于mid的一些值 所以额外把一个修改变成一个值的删除和一个值的添加 这样就相互独立了! 整体二分,树状 ...
- 【POJ】【2104】区间第K大
可持久化线段树 可持久化线段树是一种神奇的数据结构,它跟我们原来常用的线段树不同,它每次更新是不更改原来数据的,而是新开节点,维护它的历史版本,实现“可持久化”.(当然视情况也会有需要修改的时候) 可 ...
- poj 2104 主席树(区间第k大)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 44940 Accepted: 14946 Ca ...
- POJ 2104 && POJ 2761 (静态区间第k大,主席树)
查询区间第K大,而且没有修改. 使用划分树是可以做的. 作为主席树的入门题,感觉太神奇了,Orz /* *********************************************** ...
随机推荐
- ansible一键安装mysql8.0
ansbile安装: # ansible在CentOS7中需要安装epel仓库 yum install -y epel-release yum install -y ansible 安装有好几种方法, ...
- Math.Round和四舍五入
Math.Round方法并不是像想象中的四舍五入, 可以从下面的输出结果看出来: Math.Round(3.44, 1); //Returns 3.4. Math.Round(3.45, 1); // ...
- 谈谈你对vuex的理解
vuex创建公有仓库的插件 1.储存公共状态 2.能够根据事件来修改状态 3.多个组件都需要变化,有机制把这个新的状态通知给所有的组件 vuex中的四个类 1.state 定义需要共享的状态 2 ...
- JavaScript实现选择排序
一.选择排序简介 **冒泡排序.插入排序.选择排序合称为简单排序.**下面是选择排序的思想: 假设有一个数组a,我们想象成有一个班级名叫a班,现在全班随意排成一排,排头的位置是a[0],排尾的位置是a ...
- Codeforce 239 B. Easy Tape Programming
There is a programming language in which every program is a non-empty sequence of "<" a ...
- SpringBoot:整合Druid、MyBatis
目录 简介 JDBC 导入依赖 连接数据库 CRUD操作 自定义数据源 DruidDataSource Druid 简介 配置数据源 配置 Druid 数据源监控 配置 Druid web 监控 fi ...
- spring mvc从前台往后台传递参数的三种方式
jsp页面: 第一种:使用控制器方法形参的方式(常用) 第二种:使用模型传参的方式(如果前台往后台传递的参数非常多,如果还使用形参的方式传递,非常复杂.我们可以使用模型传参的方式,把多 个请求的参数 ...
- Spring Cloud 学习 之 Spring Cloud Bus实现修改远程仓库后配置自动刷新
版本号: Spring Boot:2.1.3.RELEASE Spring Cloud:G版 开发工具:IDEA 搭建配置中心,这里我们搭建一个简单版的就行 POM: <?xml ...
- java结合email实现自动推送
1.获取表中最后一条数据 public static String demo() throws SQLException { String sql = "select * FROM baox ...
- Linux内核驱动学习(九)GPIO外部输入的处理
文章目录 前言 设备树 两个结构体 gpio_platform_data gpio_demo_device 两种方式 轮询 外部中断 总结 附录 前言 前面是如何操作GPIO进行输出,这里我重新实现了 ...