【刷题】BZOJ 1901 Zju2112 Dynamic Rankings
Description
给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。
Input
第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。
分别表示序列的长度和指令的个数。
第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。
接下来的m行描述每条指令
每行的格式是下面两种格式中的一种。
Q i j k 或者 C i t
Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)
表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。
C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t
m,n≤10000
Output
对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。
Sample Input
5 3
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3
Sample Output
3
6
Solution
这是一道树套树的题目,树状数组套主席树
从最基本的开始
找区间第\(k\)大,主席树
如果我们对于修改直接暴力做,那么正确性保证,但复杂度不能承受
那么我们就想什么东西可以帮助主席树维护动态的前缀和(静态的查询其实主席树自己就把前缀和做了),而查询第\(k\)大的事情还是由主席树做
于是我们就想到了BIT(树状数组)
常用的BIT可以支持单点修改求前缀和
那么我们把BIT的“点”变成主席树的“树”,就可以完成这道题了
#include<bits/stdc++.h>
#define ll long long
#define db double
#define ld long double
#define Mid ((l+r)>>1)
#define lson l,Mid
#define rson Mid+1,r
#define left 0
#define right 1
const int MAXN=10000+10;
int n,m,A[MAXN];
struct node{
char opt;
int i,j,k,t;
};
node Q[MAXN];
std::vector<int> V;
std::map<int,int> M;
struct ChairManTree_BIT{
int cnt,lc[MAXN<<9],rc[MAXN<<9],num[MAXN<<9],root[MAXN],need[2][20],nt[2],size;
inline void init()
{
cnt=0;
memset(lc,0,sizeof(lc));
memset(rc,0,sizeof(rc));
memset(num,0,sizeof(num));
}
inline int lowbit(int x)
{
return x&(-x);
}
inline void Insert(int &rt,int l,int r,int pos,int val)
{
if(!rt)rt=++cnt;
num[rt]+=val;
if(l==r)return ;
else
{
if(pos<=Mid)Insert(lc[rt],lson,pos,val);
else Insert(rc[rt],rson,pos,val);
}
}
inline void add(int x,int k,int p)
{
while(x<=n)
{
Insert(root[x],1,size,k,p);
x+=lowbit(x);
}
}
inline void Gneed(int nxt[])
{
for(register int i=1;i<=nt[left];++i)need[left][i]=nxt[need[left][i]];
for(register int i=1;i<=nt[right];++i)need[right][i]=nxt[need[right][i]];
}
inline int Query(int l,int r,int k)
{
if(l==r)return l;
else
{
int t=0;
for(register int i=1;i<=nt[right];++i)t+=num[lc[need[right][i]]];
for(register int i=1;i<=nt[left];++i)t-=num[lc[need[left][i]]];
if(k<=t)
{
Gneed(lc);
return Query(lson,k);
}
else
{
Gneed(rc);
return Query(rson,k-t);
}
}
}
inline int sum(int l,int r,int k)
{
nt[left]=nt[right]=0;
l--;
while(l>0)
{
need[left][++nt[left]]=root[l];
l-=lowbit(l);
}
while(r>0)
{
need[right][++nt[right]]=root[r];
r-=lowbit(r);
}
return Query(1,size,k);
}
};
ChairManTree_BIT T;
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char c='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(c!='\0')putchar(c);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void newnum(int &x)
{
int pre=x;
x=lower_bound(V.begin(),V.end(),x)-V.begin()+1;
M[x]=pre;
}
inline void discre()
{
std::sort(V.begin(),V.end());
V.erase(unique(V.begin(),V.end()),V.end());
T.size=V.size();
for(register int i=1;i<=n;++i)newnum(A[i]);
for(register int i=1;i<=m;++i)
if(Q[i].opt=='C')newnum(Q[i].t);
}
int main()
{
read(n);read(m);
for(register int i=1;i<=n;++i)
{
read(A[i]);
V.push_back(A[i]);
}
for(register int i=1;i<=m;++i)
{
std::cin>>Q[i].opt;
if(Q[i].opt=='Q')read(Q[i].i),read(Q[i].j),read(Q[i].k);
else
{
read(Q[i].i),read(Q[i].t);
V.push_back(Q[i].t);
}
}
discre();
T.init();
for(register int i=1;i<=n;++i)T.add(i,A[i],1);
for(register int i=1;i<=m;++i)
{
if(Q[i].opt=='Q')write(M[T.sum(Q[i].i,Q[i].j,Q[i].k)],'\n');
if(Q[i].opt=='C')
{
T.add(Q[i].i,A[Q[i].i],-1);
A[Q[i].i]=Q[i].t;
T.add(Q[i].i,A[Q[i].i],1);
}
}
return 0;
}
【刷题】BZOJ 1901 Zju2112 Dynamic Rankings的更多相关文章
- bzoj 1901: Zju2112 Dynamic Rankings(树套树)
1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...
- BZOJ 1901 Zju2112 Dynamic Rankings
树阵主席设置树.维护间隔动态K大. .. ZOJ到空间太小,太大,仅仅能到BZOJ上交 1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memor ...
- BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7143 Solved: 2968[Su ...
- Bzoj 1901: Zju2112 Dynamic Rankings 树套树,线段树,平衡树,Treap
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6471 Solved: 2697[Su ...
- Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6321 Solved: 2628[Su ...
- BZOJ 1901: Zju2112 Dynamic Rankings( 树状数组套主席树 )
裸的带修改主席树.. 之前用BIT套Splay( http://www.cnblogs.com/JSZX11556/p/4625552.html )A过..但是还是线段树好写...而且快(常数比平衡树 ...
- BZOJ 1901: Zju2112 Dynamic Rankings( BIT 套 BST )
BIT 套 splay 其实也是不难...每个 BIT 的结点保存一颗 splay , 询问就二分答案然后判断rank... ------------------------------------- ...
- bzoj 1901: Zju2112 Dynamic Rankings -- 主席树,树状数组,哈希
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...
- BZOJ 1901: Zju2112 Dynamic Rankings 区间k大 带修改 在线 线段树套平衡树
之前写线段树套splay数组版..写了6.2k..然后弃疗了.现在发现还是很水的..嘎嘎.. zju过不了,超时. upd:才发现zju是多组数据..TLE一版才发现.然后改了,MLE...手写内存池 ...
随机推荐
- 二级域名 cookie session 共享
setcookie('login','12345',0,'/','.abc.com'); session_set_cookie_params(0,'/','.abc.com');session_sta ...
- 统计学习方法c++实现之七 提升方法--AdaBoost
提升方法--AdaBoost 前言 AdaBoost是最经典的提升方法,所谓的提升方法就是一系列弱分类器(分类效果只比随机预测好一点)经过组合提升最后的预测效果.而AdaBoost提升方法是在每次训练 ...
- mac zsh不自动加载~/.bashrc
修改了bashrc, 新开一个终端都要source一下才起作用. 网上有说需要在 . bash_profile加载一次.bashrc. 但是这个和我的问题不一样. 我用的是zsh,需要修改~/.zsh ...
- 32bit 天堂服务端假设教程
本文作者:smeli(俄罗斯人,于2009年完成该教程) PS:要比国内写的那些教程完整,详细,希望大家喜欢 VS运行库安装………………………………………..2 SQL数据库安装…………………………… ...
- spring boot 配置全局日期类型转换器
1. 首先自定义一个类型转换器 import org.springframework.core.convert.converter.Converter; import org.springframew ...
- Netty源码分析第5章(ByteBuf)---->第10节: SocketChannel读取数据过程
Netty源码分析第五章: ByteBuf 第十节: SocketChannel读取数据过程 我们第三章分析过客户端接入的流程, 这一小节带大家剖析客户端发送数据, Server读取数据的流程: 首先 ...
- css 剩余宽度完全填充
从网上转的. <html> <head> <meta http-equiv="Content-Type" content="text/htm ...
- git 查看对比分支commit命令笔记
git log newheader(branch1) ^release(branch2) -- branch1 上比branch2多的commit 注意brnach2后面要--
- SpringMVC 常用注释
@Controller Controller控制器是通过服务接口定义的提供访问应用程序的一种行为 @Repository Dao层的标志 @RequestMapping 标注控制层函数的访问路径 ...
- ListViewAnimations使用时报错NoClassDefFoundError: com.nineoldandroids.animation.Animator
见 https://github.com/nhaarman/ListViewAnimations/issues/294 解决: Add this to your dependencies in you ...