[luogu P2617] Dynamic Rankings 带修主席树
带修改的主席树,其实这种,已经不能算作主席树了,因为这个没有维护可持久化的。。。
主席树直接带修改的话,由于这种数据结构是可持久化的,那么要相应改动,这个节点以后所有的主席树,这样单次修改,就达到n*log n 的复杂度
现在介绍这种待修改的主席树,本质上是用树状数组的区间查询维护的线段树,树状数组的每个点,都开一个权值线段树,维护的是lowbit(x)-x之间的数字的出现次数
这样我们相当于,把一个1-n权值线段树,用树状数组给砍成logn段,这样就非常方便。。。我们用树状数组遍历维护前缀和的过程,变成维护树的前缀的过程,这样单次维护的复杂度,大概为两个log,还是可以接受的
模版题
#include<bits/stdc++.h>
using namespace std;
const int maxx = 2e5+;
struct node{
int l,r,cnt;
}tree[maxx*];
struct query{
int l,r,k;
}que[maxx*];
int trl[maxx],trr[maxx],a[maxx],root[maxx];
int cnt,lenx,leny,n,sz;
vector<int>p;
void update(int l,int r,int pre,int &now,int pos,int w){
now=++cnt;
tree[now]=tree[pre];
tree[now].cnt+=w;
if (l==r)
return ;
int mid=(l+r)>>;
if (pos<=mid){
update(l,mid,tree[pre].l,tree[now].l,pos,w);
}else{
update(mid+,r,tree[pre].r,tree[now].r,pos,w);
}
}
/**查询区间第k大**/
int query(int l,int r,int k){
if(l==r)
return l;
int s=;
///查询区间个数
for (int i=;i<=lenx;i++){
s-=tree[tree[trl[i]].l].cnt;
}
for (int i=;i<=leny;i++){
s+=tree[tree[trr[i]].l].cnt;
}
int mid=(l+r)>>;
if(k<=s){
///把询问变成询问单点的左子树
for(int i=;i<=lenx;i++){
trl[i]=tree[trl[i]].l;
}
for(int i=;i<=leny;i++){
trr[i]=tree[trr[i]].l;
}
return query(l,mid,k);
}else {
///把询问变成询问单点的右子树
for(int i=;i<=lenx;i++){
trl[i]=tree[trl[i]].r;
}
for(int i=;i<=leny;i++){
trr[i]=tree[trr[i]].r;
}
return query(mid+,r,k-s);
}
}
int lowbit(int x){
return x&(-x);
}
void add(int x,int w){
int pos=lower_bound(p.begin(),p.end(),a[x])-p.begin()+;
for (int i=x;i<=n;i+=lowbit(i)){
update(,sz,root[i],root[i],pos,w);
}
}
int main(){
int q;
scanf("%d%d",&n,&q);
cnt=;
for (int i=;i<=n;i++){
scanf("%d",&a[i]);
p.push_back(a[i]);
}
for (int i=;i<=q;i++){
char op[];
scanf("%s",op);
if(op[]=='C'){
scanf("%d%d",&que[i].l,&que[i].r);
que[i].k=;
p.push_back(que[i].r);
}else{
scanf("%d%d%d",&que[i].l,&que[i].r,&que[i].k);
}
}
///把点全部离散排序
sort(p.begin(),p.end());
p.erase(unique(p.begin(),p.end()),p.end());
sz=p.size();
for (int i=;i<=n;i++){
add(i,);
}
for (int i=;i<=q;i++){
if (que[i].k){
lenx=;leny=;
for (int j=que[i].r;j;j-=lowbit(j)){
trr[++leny]=root[j];
}
for (int j=que[i].l-;j;j-=lowbit(j)){
trl[++lenx]=root[j];
}
printf("%d\n",p[query(,sz,que[i].k)-]);
}else{
///前缀中删除这个树的影响
add(que[i].l,-);
a[que[i].l]=que[i].r;
add(que[i].l,);
}
}
return ;
}
[luogu P2617] Dynamic Rankings 带修主席树的更多相关文章
- BZOJ1901 Dynamic Rankings|带修主席树
题目链接:戳我 其实我并不会做,于是看了题解 我们都知道主席树是利用前缀和记录历史版本来搞区间K大的一种数据结构.不过一般的主席树只能搞定静态区间第K大.如果带修怎么办呢? 想一下...单点修改+区间 ...
- 【BZOJ-1901】Dynamic Rankings 带修主席树
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7292 Solved: 3038[Su ...
- BZOJ 1901: Zju2112 Dynamic Rankings | 带修改主席树
题目: emmmm是个权限题 题解: 带修改主席树的板子题,核心思想是用树状数组维护动态前缀和的性质来支持修改 修改的时候修改类似树状数组一样进行logn个Insert 查询的时候同理,树状数组的方法 ...
- P2617 Dynamic Rankings(带修主席树)
所谓带修主席树,就是用树状数组的方法维护主席树的前缀和 思路 带修主席树的板子 注意数据范围显然要离散化即可 代码 #include <cstdio> #include <cstri ...
- 【BZOJ-1146】网络管理Network DFS序 + 带修主席树
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3495 Solved: 1032[Submi ...
- Luogu P2617 Dynamic Rankings
带修主席树的模板,因为状态不好所以敲了很长时间,不过写完感觉能更好地理解主席树了. 核心其实就是树状数组套主席树,维护方法不再是以前的那种一步一修改,而是对于树状数组上的每一个点建立一棵权值线段树,然 ...
- 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 ...
- 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)
3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...
- luogu P2617 Dynamic Rankings(主席树)
嘟嘟嘟 一句话题意:带修改区间第\(k\)小. 不修改都会,主席树板子.但是有修改就要比较深入的理解主席树了. 众所周知,主席树中以\(i\)为根的线段树维护的是\([1, i]\)这个前缀的权值,因 ...
随机推荐
- 006-使用python编写一个猜数字的程序
题目:随机生成一个数字,共有三次机会对该数字进行猜测. #功能点# 1.猜错的时候给出提示,告诉用户输入的值是大了还是小了# 2.最多提供三次机会# 3.随机生成需要猜的数字答案 编写思路: 1.刚开 ...
- java-编码解码-流的操作规律
一 编码解码 字符串:String 字节数组:byte[]字符串--编码(getBytes())-->字节数组字节数组--解码(new String(byte[]))-->字符串 publ ...
- sar网络统计数据
sar是一个研究磁盘I/O的优秀工具.以下是sar磁盘I/O输出的一个示例. 第一行-d显示磁盘I/O信息,5 2选项是间隔和迭代,就像sar数据收集器那样.表3-3列出了字段和说明. 表3-3 ...
- 利用Git搭建自动部署的Laravel环境 - 钟晨宇的博客 - CSDN博客
目标:服务器上搭建Laravel环境,本地使用IDE进行开发,使用Homestead做本地调试环境,代码提交后自动部署到服务器Root目录下. 下面是整个流程的示意图: 1. 准备工作,搭建LNMP ...
- 【python之路18】内置函数,补充请看【python之路46】
1.abs(number)表示某个数字的绝对值 print(abs(-123)) #打印出123 2.all(iterable) 表示可迭代的参数全部为True那么返回True,否则返回False r ...
- select @@identity的用法 转
用select @@identity得到上一次插入记录时自动产生的ID 如果你使用存储过程的话,将非常简单,代码如下:SET @NewID=@@IDENTITY 说明: 在一条 INSERT.SELE ...
- UIImageView添加圆角
最直接的方法就是使用如下属性设置: 1 2 3 imgView.layer.cornerRadius = 10; // 这一行代码是很消耗性能的 imgView.clipsToBounds = YES ...
- 深入浅出Cocoa之类与对象【转】
最近打算写一些ObjC中比较底层的东西,尤其是 runtime 相关的.苹果已经将 ObjC runtime 代码开源了,我们可以从:http://opensource.apple.com/sourc ...
- CSS浏览器兼容解决方案
1.在ie8的甑别上,如何让样式只对ie8起作用? 用ie浏览器独有的文档注释的方式.像这样: <!DOCTYPE html> <!--> <html class=&qu ...
- Struts → 《Struts2程序开发》教材大纲