题目链接

  树状数组套主席树有点难懂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. 面向对象-类-成员变量-局部变量-this

    1.能够理解面向对象的思想     面向对象是基于面向过程的编程思想,强调的是对象,由对象去调用功能.它是一种更符合人类习惯的编程思想,可以将复杂的事情简单化,将我们的角色从执行者变成了指挥者. 2. ...

  2. iOS组件化开发· 什么是组件化

    越来越多公司,开始了组件化,你还要等到什么时候...... 说到开发模式,我们最熟知的开发模式 MVC 或者最近比较热门的MVVM.但是我今天说的组件化的开发,其实MVC不是一类的.它其实是····· ...

  3. ycsb模板介绍

    #对应的mongodb uri参数等mongodb.url=mongodb://127.0.0.1:27010/test_1 #对应的mongo数据库名称mongodb.database=test_1 ...

  4. Oracle种常用性能监控SQL语句

    --Oracle常用性能监控SQL语句 --1 SELECT * FROM SYS.V_$SQLAREA WHERE DISK_READS > 100; --2 监控事例的等待 SELECT E ...

  5. Android学习总结(四)—— Activity和 Service进行通信

    一.Activity 和 Service进行通信的基本概念 前面我们学习我生命周期里面包含了启动和停止服务的方法,虽然服务器在活动里启动,但在启动了服务之后,活动与服务基本就没有什么关系了.我们在活动 ...

  6. 深度技术GHOST WIN7系统32,64位旗舰稳定版

    系统来自系统妈:http://www.xitongma.com 系统概述 深度技术ghost win8 X86(32位)旗舰稳定版系统集成了SATA/RAID/SCSI驱动,支持P45. MCP78. ...

  7. COGS 2280. [HZOI 2015]树白黑

    ★★   输入文件:B_Tree.in   输出文件:B_Tree.out   简单对比时间限制:2 s   内存限制:512 MB [题目描述] 给定一棵有根树,树根为1,一开始这棵树所有节点均为白 ...

  8. SQL还原数据库

    还原一个备份数据库的经历. 首先,手头上有工程文件及相应的数据库的备份. 步骤: 1.在工程文件里找到配置文件,我这个是在bin目录里找到config.ini 2.双击打开它,里面有一些数据库的相关信 ...

  9. STL:string类中size()与length()的区别

    结论是:两者没有任何区别 解释: C++Reference中对于两者的解释: 两者的具体解释都一模一样: 理解: length是因为C语言的习惯而保留下来的,string类最初只有length,引进S ...

  10. python爬虫---实现项目(三) Selenium分析美团美食

    上一期博客,我本来想爬取美团美食的,但是由于请求头太复杂,没有破解开其中的几个参数,所以放弃,这次我们来用selenium来模式浏览器抓取数据,我们先来简单看一下流程: 1,利用selenium驱动浏 ...