P2617 Dynamic Rankings(带修主席树)
所谓带修主席树,就是用树状数组的方法维护主席树的前缀和
思路
带修主席树的板子
注意数据范围显然要离散化即可
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct Node{
int sz,lson,rson;
}PT[100100*400];
struct Q{
char c;
int l,r,x,val;
}opt[100100];
const int MAXV = 1e9+10;
int Nodecnt,lcnt,rcnt,root[100100],n,m,a[100100],num[200100],nx;
int lroot[100100],rroot[100100];
int lowbit(int x){
return x&(-x);
}
void update(int L,int R,int &o,int c,int x){
PT[++Nodecnt]=PT[o];
o=Nodecnt;
PT[o].sz+=c;
if(L==R)
return;
int mid=(L+R)>>1;
if(x<=mid)
update(L,mid,PT[o].lson,c,x);
else
update(mid+1,R,PT[o].rson,c,x);
}
int query(int l,int r,int L,int R,int k){
lcnt=0,rcnt=0;
for(int i=L-1;i;i-=lowbit(i))
lroot[++lcnt]=root[i];
for(int i=R;i;i-=lowbit(i))
rroot[++rcnt]=root[i];
while(l<=r){
if(l==r)
return l;
int lch=0,mid=(l+r)>>1;
for(int i=1;i<=rcnt;i++)
lch+=PT[PT[rroot[i]].lson].sz;
for(int i=1;i<=lcnt;i++)
lch-=PT[PT[lroot[i]].lson].sz;
if(k>lch){//to right
for(int i=1;i<=rcnt;i++)
rroot[i]=PT[rroot[i]].rson;
for(int i=1;i<=lcnt;i++)
lroot[i]=PT[lroot[i]].rson;
k-=lch;
l=mid+1;
}
else{
for(int i=1;i<=rcnt;i++)
rroot[i]=PT[rroot[i]].lson;
for(int i=1;i<=lcnt;i++)
lroot[i]=PT[lroot[i]].lson;
r=mid;
}
}
}
void set(int pos,int x,int c){//x-c
while(pos<=n){
update(1,nx,root[pos],c,x);
pos+=lowbit(pos);
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
num[++nx]=a[i];
}
for(int i=1;i<=m;i++){
char c=getchar();
while(c!='Q'&&c!='C')
c=getchar();
if(c=='Q'){
opt[i].c='Q';
scanf("%d %d %d",&opt[i].l,&opt[i].r,&opt[i].val);
}
else{
opt[i].c='C';
scanf("%d %d",&opt[i].val,&opt[i].x);
num[++nx]=opt[i].x;
}
}
sort(num+1,num+nx+1);
nx=unique(num+1,num+nx+1)-num-1;
for(int i=1;i<=n;i++)
a[i]=lower_bound(num+1,num+nx+1,a[i])-num;
for(int i=1;i<=m;i++)
if(opt[i].c=='C')
opt[i].x=lower_bound(num+1,num+nx+1,opt[i].x)-num;
for(int i=1;i<=n;i++)
set(i,a[i],1);
for(int i=1;i<=m;i++){
if(opt[i].c=='Q'){
printf("%d\n",num[query(1,nx,opt[i].l,opt[i].r,opt[i].val)]);
}
else{
set(opt[i].val,a[opt[i].val],-1);
set(opt[i].val,opt[i].x,1);
a[opt[i].val]=opt[i].x;
}
}
return 0;
}
P2617 Dynamic Rankings(带修主席树)的更多相关文章
- [luogu P2617] Dynamic Rankings 带修主席树
带修改的主席树,其实这种,已经不能算作主席树了,因为这个没有维护可持久化的... 主席树直接带修改的话,由于这种数据结构是可持久化的,那么要相应改动,这个节点以后所有的主席树,这样单次修改,就达到n* ...
- BZOJ1901 Dynamic Rankings|带修主席树
题目链接:戳我 其实我并不会做,于是看了题解 我们都知道主席树是利用前缀和记录历史版本来搞区间K大的一种数据结构.不过一般的主席树只能搞定静态区间第K大.如果带修怎么办呢? 想一下...单点修改+区间 ...
- 【BZOJ-1901】Dynamic Rankings 带修主席树
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7292 Solved: 3038[Su ...
- BZOJ 1901: Zju2112 Dynamic Rankings | 带修改主席树
题目: emmmm是个权限题 题解: 带修改主席树的板子题,核心思想是用树状数组维护动态前缀和的性质来支持修改 修改的时候修改类似树状数组一样进行logn个Insert 查询的时候同理,树状数组的方法 ...
- 【BZOJ-1146】网络管理Network DFS序 + 带修主席树
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3495 Solved: 1032[Submi ...
- 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)
P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...
- 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)
3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...
- 带修主席树 洛谷2617 支持单点更新以及区间kth大查询
题目链接:https://www.luogu.com.cn/problem/P2617 参考博客:https://blog.csdn.net/dreaming__ldx/article/details ...
- bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)
带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀. 对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了. 3k4人AC的题#256...应该不算慢 #incl ...
随机推荐
- GCD(Swift)
1.取消过去的接口 说起 GCD, 大家肯定回想起类似 dispatch_async 这样的语法. GCD 的这个语法模式无论是和 Objc 还是 Swift 的整体风格都不太打掉. 所以 Swift ...
- QtCreator 调试源码
[1]安装源码 声明:要想调试进入Qt源码,必须首先保证我们安装了Qt源码.下面说明安装Qt源码注意事项. 一般安装过程(默认不安装源码): 安装源码过程(需要自己设置,点击“全选”): 综上所述:Q ...
- xml 的 <![CDATA["URL"]]>
<![CDATA["URL"]]>:用于 xml 处理特殊字符,比如:& <PolicyURL><![CDATA[ http://ectp.t ...
- linux环境下安装qt过程
linux(虚拟机fedora9)环境下安装qt的过程主要是按照下面几网页上的教程完成的. http://mobile.51cto.com/symbian-272869.htm http://www. ...
- svn安装使用
SVN安装使用 获取项目 1.首先新建文件夹.如:测试项目. 2.接着鼠标右键选择:SVN Checkout/SVN 检出 3.在出行的对话框中输入仓库地址.如:svn://198.021.262/2 ...
- [转载]转,Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数
关于处理小数点位数的几个oracle函数() 1. 取四舍五入的几位小数 select round(1.2345, 3) from dual; 结果:1.235 2. 保留两位小数,只舍 select ...
- Hadoop学习笔记之四:HDFS客户端
HDFS的客户端核心是DFSClient类,所有使用HDFS的客户端都会持有一个DFSClient对象,或通过持有一个DistributedFileSystem对象间接使用DFSClient: DFS ...
- python-数据分析与展示(Numpy、matplotlib、pandas)---1
笔记内容整理自mooc上北京理工大学嵩天老师python系列课程数据分析与展示,本人小白一枚,如有不对,多加指正 1.ndarray对象的属性 .ndim..shape..size(元素个数,不是占用 ...
- C++中static_cast和dynamic_cast强制类型转换
在C++标准中,提供了关于类型层次转换中的两个关键字static_cast和dynamic_cast. 一.static_cast关键字(编译时类型检查) 用法:static_cast < ty ...
- ES6知识整理(7)--Set和Map数据结构
(文章会同步到博客园,技术类文章还是该让搜索引擎察觉比较好) Set构造函数 初始化一个值不重复的数组,适合做数组去重. 2种数组去重的方法: 这里再说下Array.from(),表示以一个类数组|| ...