【bzoj1901】dynamic ranking(带修改主席树)
花了一晚上总算把代码调好了……才知道待修改主席树怎么操作……
然而还是一知半解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(带修改主席树)的更多相关文章
- BZOJ 1901: Zju2112 Dynamic Rankings | 带修改主席树
题目: emmmm是个权限题 题解: 带修改主席树的板子题,核心思想是用树状数组维护动态前缀和的性质来支持修改 修改的时候修改类似树状数组一样进行logn个Insert 查询的时候同理,树状数组的方法 ...
- BZOJ1901 Dynamic Rankings|带修主席树
题目链接:戳我 其实我并不会做,于是看了题解 我们都知道主席树是利用前缀和记录历史版本来搞区间K大的一种数据结构.不过一般的主席树只能搞定静态区间第K大.如果带修怎么办呢? 想一下...单点修改+区间 ...
- 【bzoj1901】dynamic ranking(带修改主席树/树套树)
题面地址(权限题) 不用权限题的地址 首先说说怎么搞带修改主席树? 回忆一般的kth问题,我们的主席树求的是前缀和,这样我们在目标区间的左右端点的主席树差分下就能求出kth. 那么我们如何支持修改操作 ...
- 少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小
少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小 有一道题(BZOJ 1901)是这样的:n个数,m个询问,询问有两种:修改某个数/询问区间第k小. 不带修改的区间第k小用主席树很好写 ...
- [BZOJ3295] [Cqoi2011]动态逆序对(带修改主席树)
题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...
- BZOJ 1146: [CTSC2008]网络管理Network 带修改主席树_树套树_DFS序
Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路 ...
- Luogu Dynamic Ranking (带修改的主席树)
题目大意: 网址:https://www.luogu.org/problemnew/show/2617 给定一个序列a[1].a[2].....a[N],完成M个操作,操作有两种: [1]Q i j ...
- [luogu P2617] Dynamic Rankings 带修主席树
带修改的主席树,其实这种,已经不能算作主席树了,因为这个没有维护可持久化的... 主席树直接带修改的话,由于这种数据结构是可持久化的,那么要相应改动,这个节点以后所有的主席树,这样单次修改,就达到n* ...
- BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3522 Solved: 1041[Submi ...
随机推荐
- nowcoder172C 保护 (倍增lca+dfs序+主席树)
https://www.nowcoder.com/acm/contest/172/C (sbw大佬太强啦 orz) 先把每一个路径(x,y)分成(x,lca),(y,lca)两个路径,然后就能发现,对 ...
- Learn Python The Hard Way, 2nd Edition
看完了这本书,你决定继续做编程.也许它能成为你的一个职业,也许它能成为你的一项爱好.但你需要一些指导,确保自己不会走错了道路,或帮助你从这个新业余爱好中得到最大的乐趣. 我做了很久的编程.久的你都想象 ...
- Linux安装aMule下载eDonkey200网络共享文件
安装aMule 如果你的发行版本包管理器中包含amule和amule-daemon可以直接安装. 如果不包含需要在编译的Configure过程添加参数以包含amulecmd和amuled:./conf ...
- ioi2018集训队自选题:最短路练习题
题意:链接 定义pos[i]表示i这个值在数组里的下标. 我们先用单调栈找到每个元素左边和右边第一个比它大的元素$l_i$和$r_i$,然后建一棵二叉树,我们就叫做maxtree吧 (upd:mdzz ...
- 最最最最最基础的SQL Server
--创建数据库(命名不允许为汉字开头.不允许为数字开头.不允许为符号开头) create database Class --执行完成进行下一步点加go go --定位数据库 use Class --创 ...
- Hadoop+HBase+Spark+Hive环境搭建
杨赟快跑 简书作者 2018-09-24 10:24 打开App 摘要:大数据门槛较高,仅仅环境的搭建可能就要耗费我们大量的精力,本文总结了作者是如何搭建大数据环境的(单机版和集群版),希望能帮助学弟 ...
- xgboost应用
在业务中,我们经常需要对数据建模并预测.简单的情况下,我们采用 if else 判断(一棵树)即可.但如果预测结果与众多因素有关,而每一个特征的权重又不尽相同. 所以我们如何把这些特征的权重合理的找出 ...
- Python中变量的属性以及判断方法
1.变量的属性 在Python中,创建一个变量会给这个变量分配三种属性: id ,代表该变量在内存中的地址: type,代表该变量的类型: value,该变量的值: x = 10 print(id(x ...
- Python基础(协程函数、内置函数、递归、模块和包)-day05
写在前面 上课第五天,打卡: 凭着爱,再回首: 一.协程函数(生成器:yield的表达式形式) 1.yield 的语句形式: yield 1 - 这种方式在 Python基础(函数部分)-day04 ...
- 使用Eclipse Memory Analyzer 进行JAVA内存泄露分析
一,安装 Eclipse Memory Analyzer 在Memory Analyzer的官网找到 update site的地址: