【BZOJ】1901: Zju2112 Dynamic Rankings
【题意】带修改的查询区间第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的更多相关文章
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...
- 【函数式权值分块】【分块】bzoj1901 Zju2112 Dynamic Rankings
论某O(n*sqrt(n))的带修改区间k大值算法. 首先对序列分块,分成sqrt(n)块. 然后对权值分块,共维护sqrt(n)个权值分块,对于权值分块T[i],存储了序列分块的前i块的权值情况. ...
- 【分块】bzoj1901 Zju2112 Dynamic Rankings
区间k大,分块大法好,每个区间内存储一个有序表. 二分答案,统计在区间内小于二分到的答案的值的个数,在每个整块内二分.零散的暴力即可. 还是说∵有二分操作,∴每个块的大小定为sqrt(n*log2(n ...
- 【基数排序】bzoj1901 Zju2112 Dynamic Rankings
论NOIP级别的n²算法…… 跟分块比起来,理论上十万的数据只慢4.5倍左右的样子…… #include<cstdio> #include<algorithm> using n ...
- BZOJ 1901 Zju2112 Dynamic Rankings
树阵主席设置树.维护间隔动态K大. .. ZOJ到空间太小,太大,仅仅能到BZOJ上交 1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memor ...
- BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7143 Solved: 2968[Su ...
- bzoj 1901: Zju2112 Dynamic Rankings(树套树)
1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...
- Bzoj 1901: Zju2112 Dynamic Rankings 树套树,线段树,平衡树,Treap
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6471 Solved: 2697[Su ...
随机推荐
- 第二章 script元素
<script>元素 async:可选.表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本.只对外部脚本文件有效. charset:可选.表示通过 ...
- caffe环境搭建笔记
首先安装以下库或软件 sudo apt-get install gitsudo apt-get install libprotobuf-dev libleveldb-dev l ...
- 如何通过JAVA让DB2调用操作系统命令
引言:我们在工作中常用操作系统命令和DB2命令对数据库做数据的导入.导出等操作,但是DB2不支持复合SQL 语句调用操作系统命令,因此我们需要利用 UDF 来执行SQL 中不可用的操作(例如:执行一些 ...
- beta阶段——项目复审
beta阶段--项目复审 小组的名字和链接 优点 缺点 bug 排名顺序 颜罗王team http://www.cnblogs.com/LDLYMteam 界面清新,音乐能够选择是否播放,词汇按照四六 ...
- Qt容器类汇总说明
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt容器类汇总说明 本文地址:http://techieliang.com/2017/ ...
- Git(未完待续)
Git的历史咱们就不多说来,我还是喜欢直白点,直接来干货吧 在Linux上安装Git 不同的系统不同的安装命令,基础的就不说来,centos直接yum就ok. 安装完成后,还需要最后一步设置,在命令行 ...
- Java中int与String间的类型转换
int -> String int i=12345;String s=""; 除了直接调用i.toString();还有以下两种方法第一种方法:s=i+"" ...
- bug:margin合并
demo1和demo2存在margin合并问题:外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距.合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者.弥补方案:bfc; 添加一 ...
- liunx less 命令
1.命令格式: less [参数] 文件 2.命令功能: less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会 ...
- C++解析(29):类型识别
0.目录 1.类型识别 2.动态类型识别 3.类型识别关键字 4.小结 1.类型识别 在面向对象中可能出现下面的情况: 基类指针指向子类对象 基类引用成为子类对象的别名 静态类型--变量(对象)自身的 ...