【题意】带修改的查询区间第k小

【算法】树状数组套可持久化线段树

【题解】对于树状数组上的每个节点,维护可持久化权值线段树(节点为权值),从而达到查询前缀和的目的。

对于每次修改,在待修改线段树基础上运用可持久化性质来修改,先删除原数字,再加入新数字

注意记录修改后的原数字,方便后来删除。

★注意区分权值范围和数组范围的区别!!!

复杂度O(n log2n)。

注意点全部标注在代码中,细节巨多。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
using namespace std;
int read()
{
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
const int maxn=;
struct tree{int l,r,sum;}t[];//空间开大!!!100w都过不去啊。。。
char s[];
int cnt1,cnt2,a1[maxn],a2[maxn],a[maxn],b1[maxn],b2[maxn],b3[maxn],n,m,root[maxn],tot,c[maxn*],sz=; void insert(int l,int r,int x,int &y,int v,int c){
y=++sz;//设置新节点!!!
t[y]=t[x];t[y].sum+=c;
if(l==r)return;
int mid=(l+r)>>;
if(v<=mid)insert(l,mid,t[x].l,t[y].l,v,c);
else insert(mid+,r,t[x].r,t[y].r,v,c);
}
int ask(int l,int r,int v){
if(l==r)return l;
int sum=;
for(int i=;i<=cnt1;i++)sum-=t[t[a1[i]].l].sum;
for(int i=;i<=cnt2;i++)sum+=t[t[a2[i]].l].sum;
int mid=(l+r)>>;
if(sum>=v){
for(int i=;i<=cnt1;i++)a1[i]=t[a1[i]].l;
for(int i=;i<=cnt2;i++)a2[i]=t[a2[i]].l;
return ask(l,mid,v);
}
else{
for(int i=;i<=cnt1;i++)a1[i]=t[a1[i]].r;
for(int i=;i<=cnt2;i++)a2[i]=t[a2[i]].r;
return ask(mid+,r,v-sum);//转入右边要减去左边的
}
} int lowbit(int x){return x&(-x);}
void modify(int x,int k,int p){for(int i=x;i<=n;i+=lowbit(i))insert(,tot,root[i],root[i],k,p);}
//分清,tot是权值线段树范围,n是数组范围
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
a[i]=read();
c[++tot]=a[i];
}
for(int i=;i<=m;i++){
scanf("%s%d%d",s,&b1[i],&b2[i]);
if(s[]=='Q')b3[i]=read();
else c[++tot]=b2[i];
}
sort(c+,c+tot+);
tot=unique(c+,c+tot+)-c-;
for(int i=;i<=n;i++)a[i]=lower_bound(c+,c+tot+,a[i])-c;
for(int i=;i<=m;i++)if(!b3[i])b2[i]=lower_bound(c+,c+tot+,b2[i])-c;
for(int i=;i<=n;i++)modify(i,a[i],);
for(int i=;i<=m;i++){
if(b3[i]){
cnt1=;cnt2=;
for(int j=b1[i]-;j>=;j-=lowbit(j))a1[++cnt1]=root[j];
for(int j=b2[i];j>=;j-=lowbit(j))a2[++cnt2]=root[j];//用根啊老铁
printf("%d\n",c[ask(,tot,b3[i])]);//询问给的是离散化后的值,要还原
}
else{
modify(b1[i],a[b1[i]],-);
a[b1[i]]=b2[i];
modify(b1[i],b2[i],);
}
}
return ;
}

【BZOJ】1901: Zju2112 Dynamic Rankings的更多相关文章

  1. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

  2. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...

  3. 【函数式权值分块】【分块】bzoj1901 Zju2112 Dynamic Rankings

    论某O(n*sqrt(n))的带修改区间k大值算法. 首先对序列分块,分成sqrt(n)块. 然后对权值分块,共维护sqrt(n)个权值分块,对于权值分块T[i],存储了序列分块的前i块的权值情况. ...

  4. 【分块】bzoj1901 Zju2112 Dynamic Rankings

    区间k大,分块大法好,每个区间内存储一个有序表. 二分答案,统计在区间内小于二分到的答案的值的个数,在每个整块内二分.零散的暴力即可. 还是说∵有二分操作,∴每个块的大小定为sqrt(n*log2(n ...

  5. 【基数排序】bzoj1901 Zju2112 Dynamic Rankings

    论NOIP级别的n²算法…… 跟分块比起来,理论上十万的数据只慢4.5倍左右的样子…… #include<cstdio> #include<algorithm> using n ...

  6. BZOJ 1901 Zju2112 Dynamic Rankings

    树阵主席设置树.维护间隔动态K大. .. ZOJ到空间太小,太大,仅仅能到BZOJ上交 1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memor ...

  7. BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7143  Solved: 2968[Su ...

  8. bzoj 1901: Zju2112 Dynamic Rankings(树套树)

    1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...

  9. Bzoj 1901: Zju2112 Dynamic Rankings 树套树,线段树,平衡树,Treap

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6471  Solved: 2697[Su ...

随机推荐

  1. lintcode-389-判断数独是否合法

    389-判断数独是否合法 请判定一个数独是否有效. 该数独可能只填充了部分数字,其中缺少的数字用 . 表示. 注意事项 一个合法的数独(仅部分填充)并不一定是可解的.我们仅需使填充的空格有效即可. 说 ...

  2. jQuery之数组处理函数

    摘要:$.each,$.grep,$.map,$.merge,$.inArray,$.unique,$.makeArray 1. $.each(array, [callback]) 遍历[常用] 解释 ...

  3. .NET Core使用EF分页查询数据报错:OFFSET语法错误问题

    在Asp.Net Core MVC项目中使用EF分页查询数据时遇到一个比较麻烦的问题,系统会报如下错误: 分页查询代码: ) * condition.PageSize).Take(condition. ...

  4. 配置java环境 启动服务

    1:查看当前的Java JDK版本,是否符合要求,下载的为2.4.4版本,因此满足条件 [root@7 ~]# java -version openjdk version "1.8.0_65 ...

  5. HTML&CSS实体

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. solrCloud源码分析之CloudSolrClient

    CloudSolrClient是solrj提供的客户端与solrCloud交互的类.该类的实例与zookeeper进行通信来确定solrCloud collections中的solr endpoint ...

  7. BZOJ 2109 航空管制(拓扑排序+贪心)

    绝世好题啊.. 题意:给出一个DAG,和每个点要求出现在这个DAG里面的拓扑排序的位置<=ti,求出所有可能的拓扑排序里面每个点出现的位置的最小值. 正着做不好做,考虑反着做,建立这个图的反图. ...

  8. 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心

    题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...

  9. 使用android资源

    1.我们可以命名的资源种类有多少? 答: res/anim/ XML文件,它们被编译进逐帧动画(frame by frame animation)或补间动画(tweened animation)对象 ...

  10. Linux环境安装.NET运行环境

    Linux环境安装.NET运行环境 Linux环境安装.NET运行环境 1. 构建编译环境: (1) sudo apt-get install build-essential (2) sudo apt ...