【Luogu】P2617Dynamic Ranking(树状数组套主席树)
树状数组套主席树有点难懂qwq 不好理解
树状数组套主席树的直观理解应该是:树状数组的每一个节点是一棵主席树。
普通区间修改我们是创建1个线段树,树状数组套主席树的时候我们就创建log个线段树。
普通区间查询我们是把from-1 和to 两个线段树作差,树状数组套主席树的时候我们就把from-1的前缀和的log个线段树和to的log个线段树作差。
比较玄学qwq 我好像现在还是没懂
放上代码吧
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cstdio>
#define mid ((l+r)>>1)
#define maxn 10005 using namespace std; inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} inline int low(int i){ return i&(-i); } int s[maxn*],q[maxn*];
int rt[maxn**];
int sum[maxn**];
int ls[maxn**];
int rs[maxn**];
int d[maxn],w[maxn],tot,n,m,size,point,totd,totw; void build(int &o,int l,int r){
o=++tot;
if(l==r) return;
build(ls[o],l,mid);
build(rs[o],mid+,r);
} void update(int &o,int l,int r,int last,int p,int val){
o=++tot; ls[o]=ls[last]; rs[o]=rs[last]; sum[o]=sum[last]+val;
if(l==r) return;
if(p<=mid) update(ls[o],l,mid,ls[last],p,val);
else update(rs[o],mid+,r,rs[last],p,val);
} void add(int from,int val){
int value=q[from];
while(from<=n){
update(rt[from],,size,rt[from],value,val);
from+=low(from);
}
} int query(int l,int r,int e){
if(l==r) return l;
int cnt=;
for(int i=;i<=totw;++i) cnt+=sum[ls[w[i]]];
for(int i=;i<=totd;++i) cnt-=sum[ls[d[i]]];
if(e<=cnt){
for(int i=;i<=totd;++i) d[i]=ls[d[i]];
for(int i=;i<=totw;++i) w[i]=ls[w[i]];
return query(l,mid,e);
}
else{
for(int i=;i<=totd;++i) d[i]=rs[d[i]];
for(int i=;i<=totw;++i) w[i]=rs[w[i]];
return query(mid+,r,e-cnt);
}
} struct Que{
bool f;
int from,to,rank;
void add(int opt,int x,int y,int z){
f=opt;from=x;to=y;rank=z;
}
}que[maxn]; int main(){
n=read(),m=read();
for(int i=;i<=n;++i) s[++point]=q[i]=read();
for(int i=;i<=m;++i){
char ch[];int x,y;
scanf("%s%d%d",ch,&x,&y);
if(ch[]=='Q'){
int z=read();
que[i].add(,x,y,z);
}
else{
que[i].add(,x,y,);
s[++point]=y;
}
}
sort(s+,s+point+);
size=unique(s+,s+point+)-s-;
for(int i=;i<=n;++i) q[i]=lower_bound(s+,s+size+,q[i])-s;
for(int i=;i<=m;++i)
if(que[i].f) que[i].to=lower_bound(s+,s+size+,que[i].to)-s;
//build(rt[0],1,size);
for(int i=;i<=n;++i) add(i,);
for(int i=;i<=m;++i){
bool f=que[i].f;int from=que[i].from,to=que[i].to,rank=que[i].rank;
if(f){
add(from,-); q[from]=to; add(from,);
}
else{
totd=totw=;
for(int j=from-;j;j-=low(j)) d[++totd]=rt[j];
for(int j=to;j;j-=low(j)) w[++totw]=rt[j];
printf("%d\n",s[query(,size,rank)]);
}
}
return ;
}
【Luogu】P2617Dynamic Ranking(树状数组套主席树)的更多相关文章
- LUOGU P2617 Dynamic Rankings(树状数组套主席树)
传送门 解题思路 动态区间第\(k\)大,树状数组套主席树模板.树状数组的每个位置的意思的是每棵主席树的根,维护的是一个前缀和.然后询问的时候\(log\)个点一起做前缀和,一起移动.时空复杂度\(O ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
- BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树
[题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...
- BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树
BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...
- ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解
题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...
- P2617 Dynamic Rankings(树状数组套主席树)
P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...
- [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> ...
随机推荐
- js 字符串常用操作
function Class_String_Common(){ //将字符串 myString 的 start位置 和 end位置 之间的内容替换为 replaceStr this.replace1 ...
- COGS 2688. 鱼的感恩
★ 输入文件:fool.in 输出文件:fool.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 从前有一个渔夫抓到了一条特别的鱼,放走了. 渔夫再次抓到了这条 ...
- codevs 1115 开心的金明
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房 ...
- jquery最常用的几个方法。——可删除
jquery使用手册:http://www.eduyo.com/doc/jquery/cheatsheet.html $(this).hasClass("input_money") ...
- SQL还原数据库
还原一个备份数据库的经历. 首先,手头上有工程文件及相应的数据库的备份. 步骤: 1.在工程文件里找到配置文件,我这个是在bin目录里找到config.ini 2.双击打开它,里面有一些数据库的相关信 ...
- Cordova插件中JavaScript代码与Java的交互细节介绍
在Cordova官网中有这么一张架构图:大家看右下角蓝色的矩形框"Custom Plugin"--自定义插件.意思就是如果您用Cordova打包Mobile应用时,发现您的移动应用 ...
- vue watch 监听
1.普通的watch data() { return { frontPoints: 0 } }, watch: { frontPoints(newValue, oldValue) { console. ...
- abp viewmodel的写法
我的写法 public class QuotaCreateOrEditViewModel { public QuotaDto LoanQuota { get; set; } public bool I ...
- 2010: C语言实验——逆置正整数
2010: C语言实验——逆置正整数 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 949 Solved: 691[Submit][Status][We ...
- mask rcnn和roi-align
faster-rcnn的github源码中是round四舍五入 但kaiming he的ppt是直接取整 1.讲roi-align和roi-pooling区别并且详细阐述roi-align过程的博客: ...