题目链接

  树状数组套主席树有点难懂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(树状数组套主席树)的更多相关文章

  1. LUOGU P2617 Dynamic Rankings(树状数组套主席树)

    传送门 解题思路 动态区间第\(k\)大,树状数组套主席树模板.树状数组的每个位置的意思的是每棵主席树的根,维护的是一个前缀和.然后询问的时候\(log\)个点一起做前缀和,一起移动.时空复杂度\(O ...

  2. BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树

    [题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...

  3. BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树

    [题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...

  4. BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树

    BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...

  5. ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解

    题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...

  6. P2617 Dynamic Rankings(树状数组套主席树)

    P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...

  7. [COGS257]动态排名系统 树状数组套主席树

    257. 动态排名系统 时间限制:5 s   内存限制:512 MB [问题描述]给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作:1.查询A[ ...

  8. BZOJ 2141 排队(树状数组套主席树)

    解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...

  9. 洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】

    题目链接 洛谷P3759 题解 树状数组套主席树板题 #include<algorithm> #include<iostream> #include<cstring> ...

随机推荐

  1. GraphicsMagick安装&make命令使用

    0.0本过程为GraphicsMagick Linux版安装,通过典型的make编译安装. 未了支持png和jpg格式,首先请安装依赖.执行 yum install -y libpng-devel y ...

  2. Android setVisibility(View.GONE)无效的问题及原因分析

    解决方案:可以在setVisibility()之前调用clearAnimation()方法清除掉动画,或setFillAfter(false)(时间上该函数内部也调用了clearAnimation() ...

  3. shell框架

    #!/bin/bash#注释#注释#环境变量相关,如下PATH=/sbin:/bin:/usr/bin:/usr/sbin #引入库函数,如下,类似于c语言的#include "*.h&qu ...

  4. Date/Time Functions and Operators (Postgres)

            http://www.postgresql.org/docs/9.1/static/functions-datetime.html   Search Documentation:  H ...

  5. UVA 11324 The Largest Clique (强连通分量,dp)

    给出一个有向图,求一个最大的结点集合,任意两个点u,v.u可到达v或v可到达u. 一个强连通分量肯定一起选的.而且只能在一条路径上. 所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG ...

  6. python简单爬虫爬取百度百科python词条网页

    目标分析:目标:百度百科python词条相关词条网页 - 标题和简介 入口页:https://baike.baidu.com/item/Python/407313 URL格式: - 词条页面URL:/ ...

  7. 如何在vue项目中使用sass(scss)

    1.用npm/cnpm/yarn安装sass的依赖包 npm install --save-dev sass-loader npm install --save-dev node-sass 或者: y ...

  8. C++判断两个double类型双精度浮点数是否同号

    看到的一种整数的方法 != y < ) 由此, double x,y; == fabs( ) { } 目前想到的比较合适判断方法. 此外这里还有一种强制转换类型求符号位的方法. /** * Ge ...

  9. [Tkinter 教程] 布局管理 (Pack Place Grid)

    原系列地址: Python Tkinter 简介: 本文讲述如何使用 tkinter 的布局管理 (被称作 layout managers 或 geometry managers). tkinter ...

  10. (9)zabbix创建监控项item

    1. 创建监控项 点击配置(configuration)->主机(Hosts)->在你要配置的主机一栏上点击Items->点击create item.具体看截图,各个参数我都已经标注 ...