传送门(权限)

传送门(非权限)

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

然而还是一知半解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. cf757F Team Rocket Rises Again (dijkstra+支配树)

    我也想要皮卡丘 跑一遍dijkstra,可以建出一个最短路DAG(从S到任意点的路径都是最短路),然后可以在上面建支配树 并不会支配树,只能简单口胡一下在DAG上的做法 建出来的支配树中,某点的祖先集 ...

  2. Java内存模型基础

    Java内存模型的基础 并发编程模型的两个关键问题 在并发编程种,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体).通信是指线程之间以何种机制来交换信息.在 ...

  3. A1091. Acute Stroke

    One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the re ...

  4. 再谈一次关于Java中的 AIO(异步IO) 与 NIO(非阻塞IO)

    今天用ab进行压力测试时,无意发现的: Requests per second:    xxx [#/sec] (mean) ab -n 5000 -c 1000 http://www:8080/up ...

  5. Django-Ajax及跨域请求

    Ajax准备知识:json 什么是json? 定义: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w ...

  6. mysql 日志清理

    1.查看binlog日志 show binary logs; 2.删除某个日志文件之前的所有日志文件purge binary logs to 'bin.000106'; 3.再看show binary ...

  7. Exception in thread "main" java.util.InputMismatchException

    今天写代码来了一个异常 /** * 需求分析:根据输入的天数是否是周六或是周日, * 并且天气的温度大于28摄氏度,则外出游泳,否则钓鱼 * @author chenyanlong * 日期:2017 ...

  8. location的三种连接方式和区别

    location.href是一个属性,要这样使用:location.href='http://www.example.com'而location.assign('http://www.example. ...

  9. Python 爬虫的工具列表 附Github代码下载链接

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  10. Hadoop基础-配置历史服务器

    Hadoop基础-配置历史服务器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  Hadoop自带了一个历史服务器,可以通过历史服务器查看已经运行完的Mapreduce作业记录,比 ...