P2617 Dynamic Rankings
题目描述
给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令。
对于每一个询问指令,你必须输出正确的回答。
输入输出格式
输入格式:
第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。分别表示序列的长度和指令的个数。
第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。接下来的m行描述每条指令,每行的格式是下面两种格式中的一种。 Q i j k 或者 C i t
Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。
C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t。
输出格式:
对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。
输入输出样例
5 3
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3
3
6
说明
10%的数据中,m,n≤100;
20%的数据中,m,n≤1000;
50%的数据中,m,n≤10000。
对于所有数据,m,n≤100000
请注意常数优化,但写法正常的整体二分和树套树都可以以大约1000ms每个点的时间过。
来源:bzoj1901
本题数据为洛谷自造数据,使用CYaRon耗时5分钟完成数据制作。
Solution:
本题带修改主席树板子题。
原题数据用分快或者线段树套平衡树可过,加强版的话貌似只能整体二分或者带修改主席树了。
说下带修改主席树,其实很简单。
主席树可以理解为前缀式线段树,而对于前缀和上的修改,维护利器就是树状数组啦。
我们在普通主席树建树的基础上,对i节点的建树,改为对Bit上包含该节点的每个位置都构建主席树。
那么单点修改时直接先去掉该节点,改完值后再插入树中 ; 而区间查询第k大的值,直接取出Bit维护的$r,l-1$的各个前缀主席树相减,得到该段区间上的分布情况,然后普通主席树的第k大值查询就好了。
代码:
/*Code by 520 -- 9.19*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
#define lowbit(x) (x&-x)
using namespace std;
const int N=;
int n,m,rt[N],cnt,tot,*Q[N<<],val[N];
int a[N],qa[N],qb[N],qc[N],qd[N],X[N],Y[N],tx,ty;
struct node{
int ls,rs,siz;
}t[N*];
char s[]; int gi(){
int a=;char x=getchar();bool f=;
while((x<''||x>'')&&x!='-') x=getchar();
if(x=='-') x=getchar(),f=;
while(x>=''&&x<='') a=(a<<)+(a<<)+(x^),x=getchar();
return f?-a:a;
} il bool cmp(const int *a,const int *b){return *a<*b;} void ins(int l,int r,int k,int x,int lst,int &rt){
if(!rt) rt=++tot; t[rt]=t[lst],t[rt].siz+=x;
if(l==r) return;
int m=l+r>>;
if(k<=m) ins(l,m,k,x,t[lst].ls,t[rt].ls);
else ins(m+,r,k,x,t[lst].rs,t[rt].rs);
} il void update(int i,int v){
int k=a[i];
while(i<=n) ins(,cnt,k,v,rt[i],rt[i]),i+=lowbit(i);
} int query(int x){
int l=,r=cnt,k=qc[x];
tx=ty=;
for(RE int i=qa[x]-;i;i-=lowbit(i)) X[++tx]=rt[i];
for(RE int i=qb[x];i;i-=lowbit(i)) Y[++ty]=rt[i];
while(l<r){
int m=l+r>>,res=;
For(i,,tx) res-=t[t[X[i]].ls].siz;
For(i,,ty) res+=t[t[Y[i]].ls].siz;
if(k<=res) {
For(i,,tx) X[i]=t[X[i]].ls;
For(i,,ty) Y[i]=t[Y[i]].ls;
r=m;
}
else {
For(i,,tx) X[i]=t[X[i]].rs;
For(i,,ty) Y[i]=t[Y[i]].rs;
l=m+,k-=res;
}
}
return l;
} int main(){
n=gi(),m=gi();
For(i,,n) a[i]=gi(),Q[++tot]=&a[i];
For(i,,m) {
scanf("%s",s),qa[i]=gi(),qb[i]=gi();
if(s[]=='Q') qc[i]=gi(); else Q[++tot]=&qb[i];
}
sort(Q+,Q+tot+,cmp);
int lst=-;
For(i,,tot) if(*Q[i]!=lst) lst=*Q[i],*Q[i]=++cnt,val[cnt]=lst; else *Q[i]=cnt;
memset(&t[tot=],,sizeof(t[tot]));
For(i,,n) update(i,);
For(i,,m)
if(qc[i]) printf("%d\n",val[query(i)]);
else update(qa[i],-),a[qa[i]]=qb[i],update(qa[i],);
return ;
}
P2617 Dynamic Rankings的更多相关文章
- P2617 Dynamic Rankings(树状数组套主席树)
P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...
- 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)
P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...
- 洛谷P2617 Dynamic Rankings (主席树)
洛谷P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a ...
- 洛谷 P2617 Dynamic Rankings 解题报告
P2617 Dynamic Rankings 题目描述 给定一个含有\(n\)个数的序列\(a[1],a[2],a[3],\dots,a[n]\),程序必须回答这样的询问:对于给定的\(i,j,k\) ...
- 【学习笔鸡】整体二分(P2617 Dynamic Rankings)
[学习笔鸡]整体二分(P2617 Dynamic Rankings) 可以解决一些需要树套树才能解决的问题,但要求询问可以离线. 首先要找到一个具有可二分性的东西,比如区间\(k\)大,就很具有二分性 ...
- luogu P2617 Dynamic Rankings && bzoj 1901 (带修改区间第k大)
链接:https://www.luogu.org/problemnew/show/P2617 思路: 如果直接在主席树上修改的话,每次修改都会对后面所有的树造成影响,一次修改的复杂度就会变成 : n* ...
- P2617 Dynamic Rankings(待修改区间第k大)
题目链接:https://www.luogu.org/problemnew/show/P2617 题目: 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的 ...
- 洛谷P2617 Dynamic Rankings
带修主席树模板题 主席树的单点修改就是把前缀和(大概)的形式改成用树状数组维护,每个树状数组的元素都套了一个主席树(相当于每个数组的元素root[i]都是主席树,且这个主席树维护了(i - lowbi ...
- Luogu P2617 Dynamic Rankings
带修主席树的模板,因为状态不好所以敲了很长时间,不过写完感觉能更好地理解主席树了. 核心其实就是树状数组套主席树,维护方法不再是以前的那种一步一修改,而是对于树状数组上的每一个点建立一棵权值线段树,然 ...
- P2617 Dynamic Rankings(带修主席树)
所谓带修主席树,就是用树状数组的方法维护主席树的前缀和 思路 带修主席树的板子 注意数据范围显然要离散化即可 代码 #include <cstdio> #include <cstri ...
随机推荐
- 【PaPaPa】系统架构搭建浅析 - 人人可以搭架构
声明 [PaPaPa]这个项目是以技术分享与研究为目的而做的,并非商业项目,所以更多的是提供一种思路,请勿直接在项目中使用. 上一篇隐藏开源项目地址实属无奈,为了寻找一起做这件事的同伴不得已刷了一天推 ...
- 大神教你零基础学PS,30堂课从入门到精通
ps视频教程,ps自学视频教程.ps免费视频教程下载,大神教你零基础学PS教程视频内容较大,分为俩部分: 大神教你零基础学PS--30堂课从入门到精通第一部分:百度网盘,https://pan.bai ...
- 大数据中HBase的Java接口封装
该文前提为已经搭建好的HBase集群环境,参见 HBase集群搭建与配置 ,本文主要是用Java编写一个Servlet接口,部署在Tomcat服务器上,用于提供http的接口供其他地方调用,接口中集成 ...
- 宏基4752g 开机进度条卡到75%左右,解决办法
起因:更新win10推送的更新补丁,失败自动回退.开机进度条只能走到75%,bios进不去,最后就卡在开机的logo.(还有其他人是win7直接升级win10,也出现了这种情况.)解决办法:重刷bio ...
- python爬虫之解析库正则表达式
上次说到了requests库的获取,然而这只是开始,你获取了网页的源代码,但是这并不是我们的目的,我们的目的是解析链接里面的信息,比如各种属性 @href @class span 抑或是p节点里 ...
- JDBC Mysql 驱动连接异常
在做JDBC连接Mysql的时候遇到了三个异常: 第一个是:mysql8.0 caching_sha2_password 这个异常是由于是因为在mysql8.0之前的密码规则是mysql_native ...
- .NET处理Json的几种方式
序列化里的xml,soap,binary在上一篇文章里面已经说过了,这篇主要说json. json是目前非常流行的一种序列化数据的方式,很多api都采用的是json,结构简洁,容易理解,适用性强,逐渐 ...
- 【推荐系统】neural_collaborative_filtering(源码解析)
很久没看推荐系统相关的论文了,最近发现一篇2017年的论文,感觉不错. 原始论文 https://arxiv.org/pdf/1708.05031.pdf 网上有翻译了 https://www.cnb ...
- 原生JavaScript实现的贪吃蛇
github代码地址:https://github.com/McRayFE/snake 涉及到的知识点: 键盘事件 setInterval()定时器 javascript中数组的使用 碰撞的检测 of ...
- java布局学习(新)
坚持学习java一段时间,最近自己需要做一个小型的系统,所以需要自己将自己的AWT知识巩固一下. 一.4大布局管理器. 1.边界布局BorderLayout 是JFrame和JDialog的默认布局方 ...