【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> ...
随机推荐
- 洛谷 P1774 最接近神的人_NOI导刊2010提高(02)
题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的 ...
- spark 之主成分分析
C4∗2
- GUI进化--数据与界面分离
http://blog.csdn.net/doon/article/details/5946862 1.何谓数据和界面分离? GUI,即Graphic User Interface,人机交换界面.连接 ...
- PE基础2
PE课程002 怎么找到Nt头? (PIMAGE_NT_HEADER)(DOS.e_lfanew + (DWORD)m_pBuff) 怎么找到第一个区段表? 区段头位置 = pNt + 4 + 文件头的 ...
- 树形dp——Tree2cycle
一.问题描述(题目链接) 给你一棵树,删除或添加一条边的费用都是1,问使它变成一个环的最小费用. 二.解题思路 回溯法,然后回溯的时候的当前节点度数>2(如果是成环的话肯定就是2或者小于2)就把 ...
- dinner 后台 nodemon 部署 Koa (关闭everything 安装或排除node_modules) # mysql 没开192.168.x.x 需要设置一下 #Navicat Premium,mysql 数据库版本有要求:mysql-5.7.17.msi 对??的支持
tip1:新建数据库 记得选 字符集和排序规则 utf8 -- UTF-8 Unicode utf8_general_ci 后台链接部分 1. 全局管理员安装 nodemon,后台热部署(右键 管理员 ...
- 3d点云
rgb-d:rgb加depth组成4channel的 3d点云
- orcal中创建和删除表空间和用户
1.创建表空间 create tablespace NW_DATA logging datafile 'F:\oracle\product\10.2.0\oradata\nwdb\NW_DATA.db ...
- JAVA遍历map元素
第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...
- egg.js 学习之 中间件使用
1.在框架和插件中使用中间件 编写中间件 我们先来通过编写一个简单的中间件,来看看中间件的写法. // app/middleware/middlewareOne.js // app/middlewar ...