BZOJ1901 - Dynamic Rankings(树状数组套主席树)
题目大意
给定一个有N个数字的序列,然后又m个指令,指令种类只有两种,形式如下:
Q l r k 要求你查询区间[l,r]第k小的数是哪个
C i t 要求你把第i个数修改为t
题解
动态的区间第k小,如果还是按照静态的主席树做的话,每次修改需要对n个线段树进行修改,这样显然会TLE,所以我们需要用树状数组,这样每次只需要对logn颗线段树修改即可,修改的时间复杂度为logn^2,询问的时间复杂度为logn^2,空间复杂度为nlogn^2
还有一种空间复杂度为nlogn+mlogn^2的方法,就是先建立n颗静态的主席树,空间复杂度为nlogn,然后再更新的时候用树状数组套线段树,这样空间复杂度为mlogn^2,所以总空间复杂度为nlogn+mlogn^2
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 140000
#define NN 10005
#define lson l,m,ls[s]
#define rson m+1,r,rs[s]
int ls[*MAXN],rs[*MAXN],cnt[*MAXN];
int T[MAXN],tot;
int len,n,m;
int num[MAXN];
char op[][];
int a[NN*],lt[NN],rt[NN],K[NN];
int L[],R[];
int N,M;
void build(int l,int r,int &s)
{
s=++tot;
cnt[s]=;
if(l==r) return;
int m=(l+r)>>;
build(lson);
build(rson);
}
void update(int last,int p,int l,int r,int &s,int d)
{
s=++tot;
ls[s]=ls[last],rs[s]=rs[last],cnt[s]=cnt[last]+d;
if(l==r) return;
int m=(l+r)>>;
if(p<=m) update(ls[last],p,lson,d);
else update(rs[last],p,rson,d); }
int query(int l,int r,int k)
{
if(l==r) return r;
int suma=,sumb=;
for(int i=; i<=N; i++) suma+=cnt[ls[L[i]]];
for(int i=; i<=M; i++) sumb+=cnt[ls[R[i]]];
int m=(l+r)>>,sum=sumb-suma;
if(sum>=k)
{
for(int i=; i<=N; i++) L[i]=ls[L[i]];
for(int i=; i<=M; i++) R[i]=ls[R[i]];
return query(l,m,k);
}
else
{
for(int i=; i<=N; i++) L[i]=rs[L[i]];
for(int i=; i<=M; i++) R[i]=rs[R[i]];
return query(m+,r,k-sum);
}
}
int lowbit(int x)
{
return x&-x;
}
void BIT(int x,int value,int d)
{
while(x<=n)
{
update(T[x],value,,len,T[x],d);
x+=lowbit(x);
}
}
int BIT_query(int l,int r,int k)
{
N=,M=;
while(l>)
{
L[++N]=T[l];
l-=lowbit(l);
}
while(r>)
{
R[++M]=T[r];
r-=lowbit(r);
}
return query(,len,k);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
{
scanf("%d",&num[i]);
a[++len]=num[i];
}
for(int i=; i<=m; i++)
{
scanf("%s%d%d",op[i],<[i],&rt[i]);
if(op[i][]=='Q') scanf("%d",&K[i]);
else
a[++len]=rt[i];
}
sort(a+,a+len+);
len=unique(a+,a+len+)-a-;
for(int i=; i<=n; i++) num[i]=lower_bound(a+,a++len,num[i])-a;
build(,len,T[]);
for(int i=; i<=n; i++) BIT(i,num[i],);
for(int i=; i<=m; i++)
if(op[i][]=='Q')
printf("%d\n",a[BIT_query(lt[i]-,rt[i],K[i])]);
else
{
BIT(lt[i],num[lt[i]],-);
int pos=lower_bound(a+,a+len+,rt[i])-a;
num[lt[i]]=pos;
BIT(lt[i],pos,);
}
return ;
}
BZOJ1901 - Dynamic Rankings(树状数组套主席树)的更多相关文章
- P2617 Dynamic Rankings(树状数组套主席树)
P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...
- BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树
[题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...
- ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解
题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...
- LUOGU P2617 Dynamic Rankings(树状数组套主席树)
传送门 解题思路 动态区间第\(k\)大,树状数组套主席树模板.树状数组的每个位置的意思的是每棵主席树的根,维护的是一个前缀和.然后询问的时候\(log\)个点一起做前缀和,一起移动.时空复杂度\(O ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
- BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树
BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...
- [COGS257]动态排名系统 树状数组套主席树
257. 动态排名系统 时间限制:5 s 内存限制:512 MB [问题描述]给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作:1.查询A[ ...
- BZOJ 2141 排队(树状数组套主席树)
解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...
- 洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】
题目链接 洛谷P3759 题解 树状数组套主席树板题 #include<algorithm> #include<iostream> #include<cstring> ...
- Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)
E. Anton and Permutation time limit per test 4 seconds memory limit per test 512 megabytes input sta ...
随机推荐
- 六,WPF的Application类
Application.ShutdownMode属性:通过,只要有一个窗口还没有关闭,Application类就保持应用程序处于有效状态,如果这不是所期望的行为,就可以调整该属性. 应用程序事件 Ap ...
- python 批量修改图片大小
一个文件夹下面有好多图片格式是jpg大小是1920*1080,把它们处理成1280*720并按原先图片的名保存在另一路径下这里首先要找到给定路径下所有的图片文件,然后在修改图片文件的大小,这里用到PI ...
- Java编程思想(1)
0:什么是JavaEE Java技术是个平台,在这个平台上跳舞 1:开发环境的搭建 jdk1.7.* JAVA_HOME jdk的安装路径 如:C:\Java\jdk1.7.0_72 PATH:%J ...
- .bat批处理脚本让cmd命令行提示符cd到工作目录 (转)
打开cmd,检查命令行提示符所在的默认位置(目录),进入该目录用notepad++创建一个文件,输入 @echo offrem 这个符号表示该行是注释.rem 进入f盘,需要先切换盘符,成功后才能进入 ...
- ASP.NET生命周期详解
最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等 ...
- php邮件发送 phpmailer
首先要安装phpmailer开源项目. 将class.phpmailer.php转移到php文件夹下, 编写代码: <?php require("class.phpmailer.php ...
- ASP.NET MVC 入门3、Routing
本系列文章基于Microsoft ASP.NET MVC Beta. 在一个route中,通过在大括号中放一个占位符来定义( { and } ).当解析URL的时候,符号"/"和& ...
- NRE
NRE是Non-Recurring Engineering的缩写,NRE费用即一次性工程费用,是指集成电路生产成本中非经常性发生的开支,明确地说就是新的集成电路产品的研制开发费·新产品开发过程中的设计 ...
- velocity-1.7学习笔记
Velocity是由Apache软件组织提供的一项开放源码项目,它是一个基于Java的模板引擎.通过Velocity模板语言(Velocity Template Language,VTL)定义模板(T ...
- C++:undefined reference to vtable 原因与解决办法[转]
[转]undefined reference to vtable 原因与解决办法 最近在写一套基础类库用于SG解包blob字段统计,在写完了所有程序编译时遇到一个郁闷无比的错误: MailBox.o( ...