传送门(权限)

传送门(非权限)

花了一晚上总算把代码调好了……才知道待修改主席树怎么操作……

然而还是一知半解orz……

先说说我的理解吧

我们一般建主席树的时候都是直接在序列上建的

但是如果有修改操作怎么办?

因为主席树维护的是前缀和

而树状数组刚好支持待修改前缀和

所以我们可以将主席树和树状数组一起使用

树状数组实际指向主席树上的节点

修改和查询操作用树状数组遍历,实则修改或查询主席树上的节点

 //minamoto
#include<bits/stdc++.h>
#define N 10005
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char obuf[<<],*o=obuf;
void print(int x){
if(x>) print(x/);
*o++=x%+;
}
inline int lowbit(int x){return x&(-x);}
int sum[N*],L[N*],R[N*];
int xx[N],yy[N],rt[N],a[N],b[N<<],ca[N],cb[N],cc[N];
int n,q,m,cnt=,totx,toty;
void update(int last,int &now,int l,int r,int x,int v){
sum[now=++cnt]=sum[last]+v;
L[now]=L[last],R[now]=R[last];
if(l==r) return;
int mid=(l+r)>>;
if(x<=mid) update(L[last],L[now],l,mid,x,v);
else update(R[last],R[now],mid+,r,x,v);
}
int query(int l,int r,int q){
if(l==r) return l;
int x=,mid=(l+r)>>;
for(int i=;i<=totx;++i) x-=sum[L[xx[i]]];
for(int i=;i<=toty;++i) x+=sum[L[yy[i]]];
if(q<=x){
for(int i=;i<=totx;++i) xx[i]=L[xx[i]];
for(int i=;i<=toty;++i) yy[i]=L[yy[i]];
return query(l,mid,q);
}
else{
for(int i=;i<=totx;++i) xx[i]=R[xx[i]];
for(int i=;i<=toty;++i) yy[i]=R[yy[i]];
return query(mid+,r,q-x);
}
}
void add(int x,int y){
int k=lower_bound(b+,b++m,a[x])-b;
for(int i=x;i<=n;i+=lowbit(i)) update(rt[i],rt[i],,m,k,y);
}
int main(){
//freopen("testdata.in","r",stdin);
n=read(),q=read();
for(int i=;i<=n;++i)
b[++m]=a[i]=read();
for(int i=;i<=q;++i){
char ch;
while(!isupper(ch=getc()));
ca[i]=read(),cb[i]=read();
if(ch=='Q') cc[i]=read();else b[++m]=cb[i];
}
sort(b+,b++m);
m=unique(b+,b++m)-b-;
for(int i=;i<=n;++i) add(i,);
for(int i=;i<=q;++i){
if(cc[i]){
totx=toty=;
for(int j=ca[i]-;j;j-=lowbit(j)) xx[++totx]=rt[j];
for(int j=cb[i];j;j-=lowbit(j)) yy[++toty]=rt[j];
print(b[query(,m,cc[i])]),*o++='\n';
}
else{add(ca[i],-),a[ca[i]]=cb[i],add(ca[i],);}
}
fwrite(obuf,o-obuf,,stdout);
return ;
}

然而我太菜了不会树套树和整体二分……

这里是zcysky大佬的树套树

这里是will大爷的整体二分

【bzoj1901】dynamic ranking(带修改主席树)的更多相关文章

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

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

  2. BZOJ1901 Dynamic Rankings|带修主席树

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

  3. 【bzoj1901】dynamic ranking(带修改主席树/树套树)

    题面地址(权限题) 不用权限题的地址 首先说说怎么搞带修改主席树? 回忆一般的kth问题,我们的主席树求的是前缀和,这样我们在目标区间的左右端点的主席树差分下就能求出kth. 那么我们如何支持修改操作 ...

  4. 少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小

    少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小 有一道题(BZOJ 1901)是这样的:n个数,m个询问,询问有两种:修改某个数/询问区间第k小. 不带修改的区间第k小用主席树很好写 ...

  5. [BZOJ3295] [Cqoi2011]动态逆序对(带修改主席树)

    题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...

  6. BZOJ 1146: [CTSC2008]网络管理Network 带修改主席树_树套树_DFS序

    Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路 ...

  7. Luogu Dynamic Ranking (带修改的主席树)

    题目大意: 网址:https://www.luogu.org/problemnew/show/2617 给定一个序列a[1].a[2].....a[N],完成M个操作,操作有两种: [1]Q i j ...

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

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

  9. BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]

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

随机推荐

  1. hdu 3038(扩展并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038 题意:给出区间[1,n],下面有m组数据,l r v区间[l,r]之和为v,每输入一组数据,判断 ...

  2. java反射出字段信息和值

    /** * */ package test; import java.lang.reflect.Field; import java.lang.reflect.Modifier; /** * @aut ...

  3. 百度echart初用总结

    1.先下载echarts.js.我在百度下载的是 echarts-2.2.7 (from Baidu).压缩包里面的build->dist中的echarts.js或者echarts-all.js ...

  4. maven自动打包上传nexus仓库配置

    一个基础类,可能要升级并放到私服库里,为了方便,应该能够自动打包放到nexus.这就需要配置maven一些参数与pom.xml. 依次在settings.xml文件裡輸入 <!-- nexus帳 ...

  5. eclipse中编辑properties文件无法看到中文

    如果在eclipse中编辑properties文件无法看到中文则参考“Eclipse开发环境配置-indigo.docx”添加propedit插件.

  6. shell脚本中判断上一个命令是否执行成功

    shell脚本中判断上一个命令是否执行成功 shell中使用符号“$?”来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败.结合if-else语句实现判断上一个命令是否执行成功. 示例 ...

  7. MYCAT扩容

    一.原架构图: 二.扩容 在HOST1上新增节点db_user2 在HOST2上新增节点db_user2 三.操作步骤 1.mycat 所在环境安装 mysql 客户端程序 2.mycat 的 lib ...

  8. 谈谈你对MVC的理解

    MVC 模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发. Model(模型) - 模型代表一个存取数据的对象或 JAVA ...

  9. Python基础-day02

    写在前面 上课第二天,打卡: 大人不华,君子务实. 一.进制相关 - 进制基础 数据存储在磁盘上或者内存中,都是以0.1形式存在的:即是以 二进制 的形式存在: 为了存储和展示,人们陆续扩展了数据的表 ...

  10. 一个简单的"RPC框架"代码分析

    0,服务接口定义---Echo.java /* * 定义了服务器提供的服务类型 */ public interface Echo { public String echo(String string) ...