所谓带修主席树,就是用树状数组的方法维护主席树的前缀和

思路

带修主席树的板子

注意数据范围显然要离散化即可

代码

#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(带修主席树)的更多相关文章

  1. [luogu P2617] Dynamic Rankings 带修主席树

    带修改的主席树,其实这种,已经不能算作主席树了,因为这个没有维护可持久化的... 主席树直接带修改的话,由于这种数据结构是可持久化的,那么要相应改动,这个节点以后所有的主席树,这样单次修改,就达到n* ...

  2. BZOJ1901 Dynamic Rankings|带修主席树

    题目链接:戳我 其实我并不会做,于是看了题解 我们都知道主席树是利用前缀和记录历史版本来搞区间K大的一种数据结构.不过一般的主席树只能搞定静态区间第K大.如果带修怎么办呢? 想一下...单点修改+区间 ...

  3. 【BZOJ-1901】Dynamic Rankings 带修主席树

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7292  Solved: 3038[Su ...

  4. BZOJ 1901: Zju2112 Dynamic Rankings | 带修改主席树

    题目: emmmm是个权限题 题解: 带修改主席树的板子题,核心思想是用树状数组维护动态前缀和的性质来支持修改 修改的时候修改类似树状数组一样进行logn个Insert 查询的时候同理,树状数组的方法 ...

  5. 【BZOJ-1146】网络管理Network DFS序 + 带修主席树

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3495  Solved: 1032[Submi ...

  6. 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 ...

  7. 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)

    3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...

  8. 带修主席树 洛谷2617 支持单点更新以及区间kth大查询

    题目链接:https://www.luogu.com.cn/problem/P2617 参考博客:https://blog.csdn.net/dreaming__ldx/article/details ...

  9. bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)

    带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀.  对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了.  3k4人AC的题#256...应该不算慢 #incl ...

随机推荐

  1. Python 5 -- 模块

    模块 - 模块就是包含函数的文件,用于共享代码. 导入已有模块 # 导入整个模块 import random # 导入整个模块 print(random.randint(0,255)) #调用模块中的 ...

  2. Python scrapy - Login Authenication Issue

    https://stackoverflow.com/questions/37841409/python-scrapy-login-authenication-issue from scrapy.cra ...

  3. STL容器之deque

    [1]deque容器 deque 是对 vector 和 list 优缺点的结合,它是处于两者之间的一种容器. [2]deque方法集 应用示例代码: #include <deque> # ...

  4. 【转】Kylin系列-使用Saiku+Kylin构建多维分析OLAP平台

    关于Kylin的介绍和使用请参考之前的文章 <分布式大数据多维分析(OLAP)引擎Apache Kylin安装配置及使用示例> Kylin对外提供的是SQL查询接口,基于Kylin构建OL ...

  5. 自制TFT-Usart通信小项目资料打包

    2010-05-08 15:05:00 用orcad画的原理图如下.

  6. 计蒜客---N的-2进制表示

    对于十进制整数N,试求其-2进制表示. 例如,因为  1*1  +  1*-2  +  1*4  +  0*-8  +1*16  +  1*-32  =  -13  ,所以(-13)_10  =  ( ...

  7. echo 命令详解

    echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串. 选项 -e:激活转义字符. 使用-e选项时,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出: \a ...

  8. 前端页面报net::ERR_CONNECTION_RESET错误的原因

    本机和测试环境都是OK的.但是一到线上就报错:可能原因总结如下: 1 可能是服务器限制了文件上传的权限. 解决方法:开通了文件上传权限. 2 也许导致这种错误的方式有很多,可能是因为post请求时提交 ...

  9. kivy中bind的使用

    一般在kivy中使用bind()来绑定回调函数,所谓回调函数,个人理解就是一个预先定义好的方法, 因为APP是静态的, 需要等待用户进行操作, 特定的操作背后都绑定了特定的回调函数, 一般有两种类型: ...

  10. Golang对文件读写操作

    package main import ( "bufio" "fmt" "io" "os" ) //写 func Wri ...