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的更多相关文章

  1. ZOJ -2112 Dynamic Rankings 主席树 待修改的区间第K大

    Dynamic Rankings 带修改的区间第K大其实就是先和静态区间第K大的操作一样.先建立一颗主席树, 然后再在树状数组的每一个节点开线段树(其实也是主席树,共用节点), 每次修改的时候都按照树 ...

  2. ZOJ 2112 Dynamic Rankings(带修改的区间第K大,分块+二分搜索+二分答案)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  3. POJ2104-- K-th Number(主席树静态区间第k大)

    [转载]一篇还算可以的文章,关于可持久化线段树http://finaltheory.info/?p=249 无修改的区间第K大 我们先考虑简化的问题:我们要询问整个区间内的第K大.这样我们对值域建线段 ...

  4. 主席树区间第K大

    主席树的实质其实还是一颗线段树, 然后每一次修改都通过上一次的线段树,来添加新边,使得每次改变就改变logn个节点,很多节点重复利用,达到节省空间的目的. 1.不带修改的区间第K大. HDU-2665 ...

  5. 【ZOJ2112】【整体二分+树状数组】带修改区间第k大

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

  6. Dynamic Rankings——带修改区间第k大

    三种做法:1.整体二分: 二分mid 考虑小于mid的修改的影响 但是大于mid的修改可能会干掉小于mid的一些值 所以额外把一个修改变成一个值的删除和一个值的添加 这样就相互独立了! 整体二分,树状 ...

  7. 【POJ】【2104】区间第K大

    可持久化线段树 可持久化线段树是一种神奇的数据结构,它跟我们原来常用的线段树不同,它每次更新是不更改原来数据的,而是新开节点,维护它的历史版本,实现“可持久化”.(当然视情况也会有需要修改的时候) 可 ...

  8. poj 2104 主席树(区间第k大)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 44940   Accepted: 14946 Ca ...

  9. POJ 2104 && POJ 2761 (静态区间第k大,主席树)

    查询区间第K大,而且没有修改. 使用划分树是可以做的. 作为主席树的入门题,感觉太神奇了,Orz /* *********************************************** ...

随机推荐

  1. weblogic创建域

    一.webLogic服务域创建 https://blog.csdn.net/github_38922197/article/details/75097320

  2. JavaScript面向对象的作用域链(转载)

    JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一.“JavaScript中无块级作用域” 在Java或C# ...

  3. CSS样式1

    编写CSS样式: 1.标签的style属性 如:<div style="width:980px;"></div> 2.写在head里面,style标签中写样 ...

  4. 27.rm命令

    rm命令可以删除指定的文件或目录.也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件,而原有文件保持不变. 选项:-f:强制删除. -r:递归处理,将指定目录下的 ...

  5. centos6.5宽带拨号上网

    CentOS6以后要安装rp-pppoe这个软件,centos之前的版本是adsl-setup命令安装. (1)查看是否安装 #rpm -qa|grep rp-pppoe 没有内容输出则没安装,若可以 ...

  6. centos6 yum安装jdk1.8+

    一.环境Linux操作系统: centos6.9 安装jdk版本: jdk1.8+ 二.安装步骤1. 检查系统是否自带有jdk[root@VM_0_11_centos ~]# rpm -qa |gre ...

  7. Android APP 性能测试之 GT 工具

    一.介绍: GT(随身调)是 APP 的随身调测平台,它是直接运行在手机上的"集成调测环境"(IDTE, Integrated Debug Environment).利用 GT,仅 ...

  8. unittest 中的方法调用时报错 ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTest

    1.调用unittest中的方法时报错: ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTe ...

  9. predixy源码学习--开篇

    最近开始研究predixy.predixy是一款高性能全功能redis代理 ,网上有的文章大部分都是功能上的介绍,很少有源码相关的分享. predixy的相关介绍在github: https://gi ...

  10. Course Selection System ZOJ - 3956 01背包+思维

    Course Selection System ZOJ - 3956 这个题目居然是一个01背包,我觉得好难想啊,根本就没有想到. 这个题目把题目给的转化为  ans = a*a-a*b-b*b 这个 ...