LUOGU P2617 Dynamic Rankings(树状数组套主席树)
解题思路
动态区间第\(k\)大,树状数组套主席树模板。树状数组的每个位置的意思的是每棵主席树的根,维护的是一个前缀和。然后询问的时候\(log\)个点一起做前缀和,一起移动。时空复杂度\(O(nlog^2n)\)。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=100005;
const int M=200005*18*18;
inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
}
int n,m,tmp[25][2],a[N],cpy[N<<1],u,cnt,rt[N];
int cnt0,cnt1;
struct Segment_tree{
int ls,rs,w;
}t[M];
struct Ask{
int op,l,r,k;
}q[N];
void update(int &x,int l,int r,int pos,int val){
if(!x) x=++cnt;t[x].w+=val;
if(l==r) return ;int mid=(l+r)>>1;
if(pos<=mid) update(t[x].ls,l,mid,pos,val);
else update(t[x].rs,mid+1,r,pos,val);
}
inline void prepare_update(int x,int val){
int now=lower_bound(cpy+1,cpy+1+u,a[x])-cpy;
for(int i=x;i<=n;i+=i&-i) update(rt[i],1,u,now,val);
}
int query(int l,int r,int k){
if(l==r) return l;int sum=0,mid=(l+r)>>1;
for(int i=1;i<=cnt1;i++) sum+=t[t[tmp[i][1]].ls].w;
for(int i=1;i<=cnt0;i++) sum-=t[t[tmp[i][0]].ls].w;
if(sum>=k){
for(int i=1;i<=cnt0;i++) tmp[i][0]=t[tmp[i][0]].ls;
for(int i=1;i<=cnt1;i++) tmp[i][1]=t[tmp[i][1]].ls;
return query(l,mid,k);
}
else {
for(int i=1;i<=cnt0;i++) tmp[i][0]=t[tmp[i][0]].rs;
for(int i=1;i<=cnt1;i++) tmp[i][1]=t[tmp[i][1]].rs;
return query(mid+1,r,k-sum);
}
}
inline int prepare_query(int l,int r,int k){
memset(tmp,0,sizeof(tmp));cnt0=cnt1=0;
for(int i=l-1;i;i-=i&-i) tmp[++cnt0][0]=rt[i];
for(int i=r;i;i-=i&-i) tmp[++cnt1][1]=rt[i];
return query(1,u,k);
}
int main(){
n=rd(),m=rd();char c;int num=n;
for(int i=1;i<=n;i++) cpy[i]=a[i]=rd();
for(int i=1;i<=m;i++) {
c=' ';while(c!='Q' && c!='C') c=getchar();
if(c=='C') q[i].op=1,q[i].l=rd(),q[i].k=rd(),cpy[++num]=q[i].k;
else q[i].op=2,q[i].l=rd(),q[i].r=rd(),q[i].k=rd();
}
sort(cpy+1,cpy+1+num);
u=unique(cpy+1,cpy+1+num)-cpy-1;
for(int i=1;i<=n;i++) prepare_update(i,1);
for(int i=1;i<=m;i++){
if(q[i].op==1){
prepare_update(q[i].l,-1);
a[q[i].l]=q[i].k;
prepare_update(q[i].l,1);
}
else printf("%d\n",cpy[prepare_query(q[i].l,q[i].r,q[i].k)]);
}
return 0;
}
LUOGU P2617 Dynamic Rankings(树状数组套主席树)的更多相关文章
- P2617 Dynamic Rankings(树状数组套主席树)
P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...
- BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树
[题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...
- ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解
题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...
- 【Luogu】P2617Dynamic Ranking(树状数组套主席树)
题目链接 树状数组套主席树有点难懂qwq 不好理解 树状数组套主席树的直观理解应该是:树状数组的每一个节点是一棵主席树. 普通区间修改我们是创建1个线段树,树状数组套主席树的时候我们就创建log个线段 ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
- BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树
BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...
- [COGS257]动态排名系统 树状数组套主席树
257. 动态排名系统 时间限制:5 s 内存限制:512 MB [问题描述]给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作:1.查询A[ ...
- BZOJ 2141 排队(树状数组套主席树)
解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...
- 洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】
题目链接 洛谷P3759 题解 树状数组套主席树板题 #include<algorithm> #include<iostream> #include<cstring> ...
随机推荐
- SQL各种JOIN
JOIN(= INNER JOIN):返回匹配的结果,没有匹配则没结果: LEFT JOIN(= LEFT OUTER JOIN):返回匹配的与左表的所有数据: RIGHT JOIN(= RIGHT ...
- mysql中or和in,in和exists的效率问题
mysql中or和in的效率问题 在网上一直看到的是or和in的效率没啥区别,一直也感觉是这样,前几天刚好在看<mysql数据库开发的36条军规>的文章,里面提到了or和in的 ...
- git filter-branch
https://github.com/git-for-windows/git/issues/2206 https://git-scm.com/docs/git-filter-branch The -- ...
- centos6.2 shutdown now关机进入单用户模式
在centos5.5时当我们输入 shutdown now 系统会进入关机状态.而centos6.2时并非如此,其他版本不清楚,而进入了单用户模式.(进入系统后想维护可做此操作.)会出现如下提示:(注 ...
- Nginx代理与反向代理、负载均衡实践
通过 Nginx 提供的反向代理和负载均衡功能,可以合理的完成业务的分配,提高网站的处理能力;同时利用缓存功能,还可以将不需要实时更新的动态页面输出结果,转化为静态网页形成缓存,从而提高网站的响应速度 ...
- python3反转列表的三种方式
1.内建函数 reversed() li = [1,2,3,4,5,6] a = list(reversed(li)) print(a) 注意:reversed()函数返回的是一个迭代器,而不是一个L ...
- Cocos2d-x之Label
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 在游戏开发中经常会使用标签文字,例如,游戏介绍,玩家积分,菜单选项,文字提示等等. LabelTTF 直接支持使用 TTF 字库 ...
- [CF895E] Eyes Closed(线段树,期望)
Desctiption 传送门:Portal 大致题意: 给你一个序列, 支持两种操作: 1 l1 r1 l2 y2 在\([l1, r1]\)随机选择一个数a, \([l2, r2]\) 内随机选择 ...
- Jmeter接口测试加解密及Bean Shell使用案例
Jmeter接口测试加解密及Bean Shell使用案例 https://blog.csdn.net/russ44/article/details/56009084 本文以base64加解密为例: 一 ...
- c# WInform 自定义导航布局
问题形成原因:软件一般都是左侧树导航或上部菜单导航,做好一个软件后,有的客户可能想用一个页面做导航图像,而各个客户用的功能可能不同,所以导航布局需要自定义. 思路:1.把菜单列出来 2.双击菜单生成一 ...