【刷题】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...手写内存池 ...
随机推荐
- web测试通用要点大全(Web Application Testing Checklist)
在测试工作中经常遇到测试同一控件功能的情景,这样几年下来也积累了各种测试功能控件的checklist,过年期间抽空整理分享出来.通过下面的清单,任何测试新手都可以快速写出媲美工作好几年的测试老鸟的测试 ...
- Java 中的接口
接口概念 接口可以理解为一种特殊的类,由全局常量和公共抽象方法组成.类是一种具体实现体,而接口定义了某一些类所要遵守的规范,接口不必关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类 ...
- vue-cli 2.x和3.x安装的区别
1.全局安装vue的脚手架:vue-cli(指定版本后面加@2.x.x) npm install -g vue-cli npm install -g @vue/cli 2.使用初始化 vue 项目: ...
- 如何fork比特币的源码并同步更新到本地
一.首先在Github上fork比特币源码,就会在自己的项目库里创建一份比特币代码的拷贝. 打开https://github.com/bitcoin/bitcoin,点击右上角的“Fok”图标,稍 ...
- 统计学习方法c++实现之二 k近邻法
统计学习方法c++实现之二 k近邻算法 前言 k近邻算法可以说概念上很简单,即:"给定一个训练数据集,对新的输入实例,在训练数据集中找到与这个实例最邻近的k个实例,这k个实例的多数属于某个类 ...
- Array.Copy 数据是克隆吗?
偶然看到 Array.Copy 方法的时候,想到,它是否是克隆,又是否是深克隆. 做了一个测试 public class abc { public string hello; } [TestMetho ...
- git 查看对比分支commit命令笔记
git log newheader(branch1) ^release(branch2) -- branch1 上比branch2多的commit 注意brnach2后面要--
- 基于spec评论作品
组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶 刘佳瑞 公冶令鑫 杨磊 杨金铭 张宇 卢帝同 一.测试目标:拉格朗日2018——飞词 下面是他们的小游戏在运行时的一些截图画面: 1.开始: ...
- Sprint9
进展:完善设置事件提醒界面,增加调用手机铃声部分,以及是否选择振动,以及可以添加事件进行保存.
- Sprint会议2
昨天:准备查找安卓APP开发的有关资料,安装有关软件 今天:自己制作一个安卓小程序,熟悉一下操作 遇到问题:安装遇到问题,环境配置出现问题