[ZJOI2006]Book书架
Description
Sally有一个很大的书柜。这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列。她用1到n的正整数给每本书都编了号。Sally在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本。由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位置。不过Sally的记忆力是非常好的,所以每次放书的时候至少能够那本书放在拿出来时的位置附近,比如说她拿的时候这本书上面有X本书,那么放回去时这本书上面就只可能有X-1、X或X+1本书。当然也有特殊情况,比如在看书的时候突然电话响了或者有朋友来访。这时候粗心的Sally会随手把书放在书柜里所有书的最上面或者最下面,然后转身离开。久而久之,Sally的书柜里的书的顺序就会越来越乱,找到特定的编号的书就变得越来越困难。于是她想请你帮她编写一个图书管理程序,处理她看书时的一些操作,以及回答她的两个提问:(1)编号为X的书在书柜的什么位置;(2)从上到下第i本书的编号是多少。
Input
第一行有两个数n,m,分别表示书的个数以及命令的条数;第二行为n个正整数:第i个数表示初始时从上至下第i个位置放置的书的编号;第三行到m+2行,每行一条命令。命令有5种形式:
1. Top S——表示把编号为S的书房在最上面。
2. Bottom S——表示把编号为S的书房在最下面。
3. Insert S T——T∈{-1,0,1},若编号为S的书上面有X本书,则这条命令表示把这本书放回去后它的上面有X+T本书;
4. Ask S——询问编号为S的书的上面目前有多少本书。
5. Query S——询问从上面数起的第S本书的编号。
n,m<=80000
Output
对于每一条Ask或Query语句你应该输出一行,一个数,代表询问的答案。
Sample Input
10 10
1 3 2 7 5 8 10 4 9 6
Query 3
Top 5
Ask 6
Bottom 3
Ask 3
Top 6
Insert 4 –1
Query 5
Query 2
Ask 2
Sample Output
2
9
9
7
5
3
这题多两个操作,取出最靠右的点和最靠左的点。insert操作把点往左挪或往右挪,Top/Down放到最上面或最下面就好了,具体操作可以看下代码
关于本人splay代码操作详解请参考浅谈算法——splay
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
	int x=0,f=1;char ch=getchar();
	for (;ch<'0'||ch>'9';ch=getchar())	if (ch=='-')    f=-1;
	for (;ch>='0'&&ch<='9';ch=getchar())	x=(x<<1)+(x<<3)+ch-'0';
	return x*f;
}
inline void print(int x){
	if (x>=10)     print(x/10);
	putchar(x%10+'0');
}
const int N=8e4;
struct Splay{
	#define T(x) (tree[f[x]][1]==x)
	int tree[N+10][2],f[N+10],size[N+10],val[N+10];
	int root,len;
	void updata(int x){size[x]=size[tree[x][0]]+size[tree[x][1]]+1;}
	void build(int n){
		for (int i=1;i<=n;i++)	val[i]=read();
		for (int i=1;i<n;i++)	f[val[i]]=val[i+1],tree[val[i+1]][0]=val[i],size[val[i]]=i;
		size[root=val[n]]=n;
	}
	void move(int x){
		int fa=f[x],son=tree[x][T(x)^1];
		tree[x][T(x)^1]=fa;
		tree[fa][T(x)]=son;
		if (son)	f[son]=fa;
		f[x]=f[fa];
		if (f[x])	tree[f[x]][T(fa)]=x;
		f[fa]=x;
		updata(fa),updata(x);
	}
	void splay(int x){
		while (f[x]){
			if (f[f[x]])	T(x)==T(f[x])?move(f[x]):move(x);
			move(x);
		}
		root=x;
	}
	int get_pre(){
		int x=tree[root][0];
		while (tree[x][1])	x=tree[x][1];
		return x;
	}
	int get_suc(){
		int x=tree[root][1];
		while (tree[x][0])	x=tree[x][0];
		return x;
	}
	int get_front(){
		int x=root;
		while (tree[x][0])	x=tree[x][0];
		return x;
	}
	int get_last(){
		int x=root;
		while (tree[x][1])	x=tree[x][1];
		return x;
	}
	void Delete(int x){
		splay(x);
		if (!(tree[x][0]&&tree[x][1])){
			f[root=tree[x][0]+tree[x][1]]=0;
			f[x]=tree[x][0]=tree[x][1]=size[x]=0;
			return;
		}
		int i=get_pre();
		splay(i);
		f[tree[i][1]=tree[x][1]]=i;
		f[x]=tree[x][0]=tree[x][1]=size[x]=0;
		updata(i);
	}
	int find(int x,int i){
		if (size[tree[i][0]]+1==x)	return i;
		if (x<=size[tree[i][0]])	return find(x,tree[i][0]);
		return find(x-size[tree[i][0]]-1,tree[i][1]);
	}
	void change(int x,int t){
		Delete(x);
		int i=t?get_last():get_front();
		splay(i);
		f[tree[i][t]=x]=i;
		size[x]++,size[i]++;
	}
	void insert(int x,int t){
		splay(x);
		int i=t?get_suc():get_pre();
		Delete(x);
		splay(i);
		f[tree[x][t]=tree[i][t]]=x;
		f[tree[i][t]=x]=i;
		size[x]=size[tree[x][t]]+1;
		size[i]++;
	}
	void Ask(int x){
		splay(x);
		printf("%d\n",size[tree[x][0]]);
	}
	void query(int x){printf("%d\n",find(x,root));}
}T;
char s[10];
int main(){
	int n=read(),m=read();
	T.build(n);
	for (int i=1;i<=m;i++){
		scanf("%s",s);
		if (s[0]=='I'){
			int x=read(),t=read();
			if (t)	T.insert(x,t==1);
		}
		if (s[0]=='T')	T.change(read(),0);
		if (s[0]=='B')	T.change(read(),1);
		if (s[0]=='A')	T.Ask(read());
		if (s[0]=='Q')	T.query(read());
	}
	return 0;
}
[ZJOI2006]Book书架的更多相关文章
- [BZOJ1861][Zjoi2006]Book 书架
		[BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ... 
- BZOJ 1861: [Zjoi2006]Book 书架
		1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1290 Solved: 740[Submit][Stat ... 
- BZOJ 1861: [Zjoi2006]Book 书架 splay
		1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书 ... 
- BZOJ_1861_[Zjoi2006]Book 书架_splay
		BZOJ_1861_[Zjoi2006]Book 书架_splay 题意: 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在 ... 
- BZOJ 1861: [Zjoi2006]Book 书架 (splay)
		1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1453 Solved: 822[Submit][Stat ... 
- [bzoj1861][Zjoi2006]Book 书架_非旋转Treap
		Book 书架 bzoj-1861 Zjoi-2006 题目大意:给你一个序列,支持:将指定编号的元素抽出,放到序列顶(底):将指定编号元素左右篡位:查询指定编号元素位置:查询指定数量位置元素编号. ... 
- fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架
		题面:P2596 [ZJOI2006]书架 题解:记录每本书对应的节点编号 普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中) ... 
- BZOJ1861[ZJOI2006]Book书架
		Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ... 
- 【平衡树】【pb_ds】 bzoj1861 [Zjoi2006]Book 书架
		需要用数组记录编号为i的书的位置,和位置i处的书的编号. Code: #include<cstdio> #include<ext/pb_ds/assoc_container.hpp& ... 
- 【权值分块】bzoj1861 [Zjoi2006]Book 书架
		权值分块……rank3……没什么好说的. #include<cstdio> #include<cmath> #include<algorithm> using na ... 
随机推荐
- hdu - 2066 一个人的旅行(基础最短路)
			http://acm.hdu.edu.cn/showproblem.php?pid=2066 把与草儿相连的城市最短距离置为0,然后进行dijkstra,在t个城市里找出距离最近的一个即可. #inc ... 
- POJ 3041_Asteroids
			题意: N*N网格中有小行星,光束能将一整行或者一整列的行星消灭,问消灭所有行星至少需要多少光束? 分析: 最小顶点覆盖问题,将每个小行星看成边,左右顶点为横纵坐标,可以转化为二分图,利用二分图中最小 ... 
- C++  fill 和memset
			以下内容来自www.cplusplus.com--------------------------------------------------- FILL: template <class ... 
- CLR运行机制
			CLR编译器会将我们的代码编译成托管模块(中间IL语言和元数据),托管模块是一个标准的PE32执行文件,或者PE32+执行文件.但是CLR实际不和托管模块一起工作,他会将托管模块合并成程序集,程序集是 ... 
- SAS编程基础 - 数据获取与数据集操作(1)
			1. 数据来源 SAS数据来源主要有两种:一是通过input语句创建,另外一种方式是通过外部数据文件获取. 1.1 libname 1.2 odbc 1.3 passthrough 1.4 impor ... 
- ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so
			fPIC作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code), 则产生的代码中,没有绝对地址,所有使用相对地址.故而代码能够被载入器载入到内存的随意 ... 
- Apache2 Web 服务器
			Apache2 Web 服务器的安装 sudo apt install apache2 -y 当安装Apache2包之后,Apache2相关的服务是启用的,并在重启后自动运行.在某些情况下如果你的Ap ... 
- HDU 2870 Largest Submatrix (单调栈)
			http://acm.hdu.edu.cn/showproblem.php? pid=2870 Largest Submatrix Time Limit: 2000/1000 MS (Java/Oth ... 
- A星算法(Java实现)
			一.适用场景 在一张地图中.绘制从起点移动到终点的最优路径,地图中会有障碍物.必须绕开障碍物. 二.算法思路 1. 回溯法得到路径 (假设有路径)採用"结点与结点的父节点"的关系从 ... 
- cocos2d-x  2.2.3 建project
			2.2以后不再使用模板安装了. 打开终端,进入cocos2d-x文件夹下的tools/project-creator,运行命令 ./create_project.py -project [项目名] - ... 
