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. vue与众不同的学习方式,让她年薪200多万

    学习vue正确思路,是先学vue-cli,再学vue.js单文件引用的用法,这样会在极短时间内撤底撑握vue,如果先学vue.js单文件用法,再去学vue-cli4,可以说是重新学vue,,,,难处大 ...

  2. 【Linux题目】第九关

    前言:项目整合 企业项目实战考试: 1. 全网备份解决方案实战 2. NFS集群后段共享存储搭建优化 3. 解决NFS单点实现实时数据同步. 环境: 服务器角色 外网ip 内网ip 主机名 web 1 ...

  3. 【Linux网络基础】网络子网划分基础知识(IP地址,子网)

    一. IP地址分类与子网划分基础 1. 什么是IP地址? 常见的ip地址版本为ipv4, ipv6 32位 4 * 8=32位. 32位二进制数字序列组成的数字序列   点分十进制 采用点将32位数字 ...

  4. 【Linux常见命令】paste命令

    paste - merge lines of files paste 命令用于合并文件的列. paste 指令会把每个文件以列对列的方式,一列列地加以合并. 语法: paste [OPTION]... ...

  5. JavaScript HTMlL DOM对象(下)

    DOM:document operation model 文档操作模型 每个标签都是一个对象. 一.查找元素 DOM 回顾 直接查找 var obj = document.getElementById ...

  6. 提高Web服务器并发响应的经历

    1 前言 ---------- 最近一直在维护一个线上运行的旧系统,系统本身的问题很多,然而又有大量客户准备试用.之前一直存有侥幸心理,希望系统能神奇的顶过这段时间,但这个蜗牛般的系统残忍的告诉我们- ...

  7. JAVA第一次blog总结

    JAVA第一次blog总结 0.前言 大一下学期我们开展了OPP这门课程,这也是我们第一次接触到JAVA.与上学期我们在学校里学C语言不同的是,这学期由于疫情原因我们是以网课的方式在学习.在学习中我发 ...

  8. INTERVIEW #4

    120min, 5题.本菜鸡怒跪. 1.变身程序员 (读取时可以按行读取,直到读到空行为止,再对读取过的所有行做转换处理) 输出描述:如果能将所有的产品经理变成程序员,输出最小的分钟数:如果不能将所有 ...

  9. AWS bind: cannot assign requested address

    最近在AWS上安装Redis,遇到一个坑. Redis默认配置文件中有个bind配置项,默认为127.0.0.1.此时只能在服务器内部访问Redis. 为了从服务器外部访问Redis,我给bind添加 ...

  10. Cordova 浅析架构的原理

    因为项目使用了Cordova,也使用了很长时间.至于有很多hybride框架,为什么我们使用Cordova,这里不做过多的叙述,我们也是根据项目需求来选定的,需要及时更新.还要输出别人SDK等.没有最 ...