传送门(权限)

传送门(非权限)

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

然而还是一知半解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. Spring Cloud(三) --- hystrix

    Hystrix 说到Hystrix就得先说一下产生的背景等等,那就是雪崩效应. 在微服务中肯定存在多个服务层之间的调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服 ...

  2. 【loj3054】【hnoi2019】鱼

    题目 描述 ​ 难以描述.......慢慢看..: ​ https://loj.ac/problem/3054 范围 ​ $6 \le n \le 1000  ,  1 \le |x| , |y| \ ...

  3. P1099 树网的核

    NOIP 2007 提高第四题. 啊......我还是看了题解才做出来的. 这题乍一看毫无头绪,但是我们spy on一下,暗中观察发现:n才300!随便打暴力水过去啊! 然后,这破题怎么暴力?感觉我的 ...

  4. 出现Exception in thread "main" java.lang.UnsupportedClassVersionError: org/broadinstitute/gatk/engine/CommandLineGATK : Unsupported major.minor version 52.0问题解决方案

    在做外显子分析Indel Realigner时,弹出以下错误: Exception in thread "main" java.lang.UnsupportedClassVersi ...

  5. idea去掉无效引用

    Mac版的idea,打开Preference->Editor->General,打勾红色框框. 然后使用快捷键 contrl + option + o 只能去掉当前文件没有引用的包,并不能 ...

  6. 选择监听事件ItemListener(是否被选择)

    [界面说明] 下拉列表框,选谁谁显示.复选框与单选按钮,输出被选与否的状态.知识点主要代码为: int state = e.getStateChange(); ItemEvent.SELECTED I ...

  7. mybatis插入数据后返回自增的主键id

    在插入数据时候想自动返回mysql的自增的主键,需要在mapper.xml中配置下: <insert id="insert" parameterType="com. ...

  8. Docker:使用Jenkins构建Docker镜像

    Docker  彭东稳  1年前 (2016-12-27)  10709次浏览  已收录  0个评论 一.介绍Jenkins Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从 ...

  9. mysql5.6下载及安装(超级详细)

    经过本人的实验,验证这些东西都是OK的 博客原文地址:http://www.cnblogs.com/Percy_Lee/p/5282187.html

  10. shiro中自定义realm实现md5散列算法加密的模拟

    shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...