BZOJ1901 Dynamic Rankings|带修主席树
题目链接:戳我
其实我并不会做,于是看了题解
我们都知道主席树是利用前缀和记录历史版本来搞区间K大的一种数据结构。不过一般的主席树只能搞定静态区间第K大。如果带修怎么办呢?
想一下。。。单点修改+区间查询,我们是否能想到树状数组呢?
那么思路就出来了。用树状数组来维护主席树的前缀和!!这里的主席树只需要维护对于每个节点所包含的值域区间中数的个数即可,不需要继承历史版本。
单次操作复杂度两个log,应该是稳稳的了。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 100010
using namespace std;
inline int read()
{
int f=1,x=0; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48); ch=getchar();}
return x*f;
}
int n,m,q_cnt,cnt,tot,cnt1,cnt2;
int a[MAXN],S[MAXN],rt[MAXN],tmp1[MAXN],tmp2[MAXN];
struct Node{int l,r,k,pos,t;}q[MAXN];
struct Node2{int ls,rs,v;}t[MAXN<<5];
inline void modify(int &now,int l,int r,int pos,int k)
{
if(!now) now=++tot;
t[now].v+=k;
if(l==r) return;
int mid=(l+r)>>1;
if(pos<=mid) modify(t[now].ls,l,mid,pos,k);
else modify(t[now].rs,mid+1,r,pos,k);
}
inline void pre_modify(int x,int k)
{
int pos=lower_bound(&S[1],&S[1+cnt],a[x])-S;
for(int i=x;i<=n;i+=i&(-i))
modify(rt[i],1,cnt,pos,k);
}
inline int query(int l,int r,int k)
{
if(l==r) {return S[l];}
int cur_ans=0;
for(int i=1;i<=cnt1;i++) cur_ans+=t[t[tmp1[i]].ls].v;
for(int i=1;i<=cnt2;i++) cur_ans-=t[t[tmp2[i]].ls].v;
int mid=(l+r)>>1;
if(cur_ans>=k)
{
for(int i=1;i<=cnt1;i++) tmp1[i]=t[tmp1[i]].ls;
for(int i=1;i<=cnt2;i++) tmp2[i]=t[tmp2[i]].ls;
return query(l,mid,k);
}
else
{
for(int i=1;i<=cnt1;i++) tmp1[i]=t[tmp1[i]].rs;
for(int i=1;i<=cnt2;i++) tmp2[i]=t[tmp2[i]].rs;
return query(mid+1,r,k-cur_ans);
}
}
inline void pre_query(int l,int r,int k)
{
cnt1=cnt2=0;
for(int i=r;i;i-=i&(-i)) tmp1[++cnt1]=rt[i];
for(int i=l;i;i-=i&(-i)) tmp2[++cnt2]=rt[i];
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) a[i]=read(),S[++cnt]=a[i];
for(int i=1;i<=m;i++)
{
char cur[10];
scanf("%s",cur);
if(cur[0]=='Q') q[i]=(Node){read()-1,read(),read(),0,0};
else q[i]=(Node){0,0,0,read(),read()},S[++cnt]=q[i].t;
}
sort(&S[1],&S[cnt+1]);
cnt=unique(&S[1],&S[cnt+1])-S-1;
for(int i=1;i<=n;i++) pre_modify(i,1);
for(int i=1;i<=m;i++)
{
if(q[i].k!=0)
{
pre_query(q[i].l,q[i].r,q[i].k);
printf("%d\n",query(1,cnt,q[i].k));
}
else
{
pre_modify(q[i].pos,-1);
a[q[i].pos]=q[i].t;
pre_modify(q[i].pos,1);
}
}
}
BZOJ1901 Dynamic Rankings|带修主席树的更多相关文章
- 【BZOJ-1901】Dynamic Rankings 带修主席树
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7292 Solved: 3038[Su ...
- [luogu P2617] Dynamic Rankings 带修主席树
带修改的主席树,其实这种,已经不能算作主席树了,因为这个没有维护可持久化的... 主席树直接带修改的话,由于这种数据结构是可持久化的,那么要相应改动,这个节点以后所有的主席树,这样单次修改,就达到n* ...
- 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 ...
- 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& ...
- bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)
带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀. 对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了. 3k4人AC的题#256...应该不算慢 #incl ...
- 带修主席树 洛谷2617 支持单点更新以及区间kth大查询
题目链接:https://www.luogu.com.cn/problem/P2617 参考博客:https://blog.csdn.net/dreaming__ldx/article/details ...
随机推荐
- BAT脚本编写教程
windows批处理 (cmd/bat) 编程详解 开始之前先简单说明下cmd文件和bat文件的区别:在本质上两者没有区别,都是简单的文本编码方式,都可以用记事本创建.编辑和查看.两者所用的命令行代码 ...
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 15—Anomaly Detection异常检测
Lecture 15 Anomaly Detection 异常检测 15.1 异常检测问题的动机 Problem Motivation 异常检测(Anomaly detection)问题是机器学习算法 ...
- elasticsearch 安装 head插件
head插件 切换到Elasticsearch的安装目录 cd ~/demo/elasticsearch/es1 执行安装命令 [root@localhost es1]# bin/plugin ins ...
- linux服务器中Apache隐藏index.php失败
可以通过URL重写隐藏应用的入口文件index.php,下面是相关服务器的配置参考: [Apache] httpd.conf配置文件中加载了mod_rewrite.so模块 AllowOverride ...
- Excel VBA 入门(零)
本教程所用系统环境: Windows 10 Excel 2013 1. 添加开发工具 打开Excel,依然找到"文件"->"选项"->"自 ...
- java命令查询属性信息
System.getProperty("user.home")可以查询JAVA系统的user.home属性的值, 除了user.home,还有user.dir, file.sepa ...
- SpringBoot29 登录逻辑、登录状态判断
1 知识点扫盲 浏览器和服务器之间时通过session来确定连接状态的,浏览器第一次请求时服务端会自动生成一个session,并将这个sessionId传回给浏览器,浏览器将这个sessionId存放 ...
- 复杂链表的复制(java)
问题描述 时间输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点), 返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引 ...
- linux sed命令详解-乾颐堂CCIE
简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...
- Scala入门学习随笔
推荐学习视频:慕课网http://www.imooc.com/learn/613,讲师:辰风 ScalaAPI:http://www.scala-lang.org/api/current/#packa ...