可修改的区间第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 /* *********************************************** ...
随机推荐
- weblogic创建域
一.webLogic服务域创建 https://blog.csdn.net/github_38922197/article/details/75097320
- JavaScript面向对象的作用域链(转载)
JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一.“JavaScript中无块级作用域” 在Java或C# ...
- CSS样式1
编写CSS样式: 1.标签的style属性 如:<div style="width:980px;"></div> 2.写在head里面,style标签中写样 ...
- 27.rm命令
rm命令可以删除指定的文件或目录.也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件,而原有文件保持不变. 选项:-f:强制删除. -r:递归处理,将指定目录下的 ...
- centos6.5宽带拨号上网
CentOS6以后要安装rp-pppoe这个软件,centos之前的版本是adsl-setup命令安装. (1)查看是否安装 #rpm -qa|grep rp-pppoe 没有内容输出则没安装,若可以 ...
- centos6 yum安装jdk1.8+
一.环境Linux操作系统: centos6.9 安装jdk版本: jdk1.8+ 二.安装步骤1. 检查系统是否自带有jdk[root@VM_0_11_centos ~]# rpm -qa |gre ...
- Android APP 性能测试之 GT 工具
一.介绍: GT(随身调)是 APP 的随身调测平台,它是直接运行在手机上的"集成调测环境"(IDTE, Integrated Debug Environment).利用 GT,仅 ...
- unittest 中的方法调用时报错 ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTest
1.调用unittest中的方法时报错: ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTe ...
- predixy源码学习--开篇
最近开始研究predixy.predixy是一款高性能全功能redis代理 ,网上有的文章大部分都是功能上的介绍,很少有源码相关的分享. predixy的相关介绍在github: https://gi ...
- Course Selection System ZOJ - 3956 01背包+思维
Course Selection System ZOJ - 3956 这个题目居然是一个01背包,我觉得好难想啊,根本就没有想到. 这个题目把题目给的转化为 ans = a*a-a*b-b*b 这个 ...