BZOJ

Luogu

Description

小T有一个很大的书柜。这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列。她用1到n的正整数给每本书都编了号。 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本。由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位置。不过小T的记忆力是非常好的,所以每次放书的时候至少能够将那本书放在拿出来时的位置附近,比如说她拿的时候这本书上面有X本书,那么放回去时这本书上面就只可能有X-1、X或X+1本书。 当然也有特殊情况,比如在看书的时候突然电话响了或者有朋友来访。这时候粗心的小T会随手把书放在书柜里所有书的最上面或者最下面,然后转身离开。 久而久之,小T的书柜里的书的顺序就会越来越乱,找到特定的编号的书就变得越来越困难。于是她想请你帮她编写一个图书管理程序,处理她看书时的一些操作,以及回答她的两个提问:(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本书的编号。

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

HINT

100%的数据,n,m < = 80000

sol

就是splay板子题呀(然而还是调了我将近两个小时)

操作1,2注意判本来就是Top或是Bottom的情况

操作3注意交换splay树上的两个节点的时候会涉及很多东西的变动,最好画个图仔细想一想,然后要PUSHUP!(我就是这里WA的)

操作4,5应该是最简单的,就不讲了

练细节的好题吧

code

#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 100005;
int n,m,fa[N],ls[N],rs[N],sz[N],a[N],root;
char s[N];
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
void pushup(int x){sz[x]=sz[ls[x]]+sz[rs[x]]+1;}
void R_rotate(int x)
{
int y=fa[x],z=fa[y];
ls[y]=rs[x];
if (rs[x]) fa[rs[x]]=y;
fa[x]=z;
if (z) if (y==ls[z]) ls[z]=x;else rs[z]=x;
rs[x]=y;fa[y]=x;
pushup(y);
}
void L_rotate(int x)
{
int y=fa[x],z=fa[y];
rs[y]=ls[x];
if (ls[x]) fa[ls[x]]=y;
fa[x]=z;
if (z) if (y==ls[z]) ls[z]=x;else rs[z]=x;
ls[x]=y;fa[y]=x;
pushup(y);
}
void splay(int x,int goal)
{
while (fa[x]!=goal)
{
int y=fa[x],z=fa[y];
if (z==goal)
if (x==ls[y]) R_rotate(x);
else L_rotate(x);
else
if (y==ls[z])
if (x==ls[y]) R_rotate(y),R_rotate(x);
else L_rotate(x),R_rotate(x);
else
if (x==ls[y]) R_rotate(x),L_rotate(x);
else L_rotate(y),L_rotate(x);
}
pushup(x);
if (!goal) root=x;
}
void Top()
{
int x=gi();
splay(x,0);
if (!ls[x]) return;
int y=ls[x];
while (rs[y]) y=rs[y];
splay(y,x);
rs[y]=rs[x];if (rs[y]) fa[rs[y]]=y;
fa[root=y]=0;pushup(y);
while (ls[y]) y=ls[y];
ls[y]=x;fa[x]=y;ls[x]=rs[x]=0;sz[x]=1;
splay(x,0);
}
void Bottom()
{
int x=gi();
splay(x,0);
if (!rs[x]) return;
int y=rs[x];
while (ls[y]) y=ls[y];
splay(y,x);
ls[y]=ls[x];if (ls[y]) fa[ls[y]]=y;
fa[root=y]=0;pushup(y);
while (rs[y]) y=rs[y];
rs[y]=x;fa[x]=y;ls[x]=rs[x]=0;sz[x]=1;
splay(x,0);
}
void Insert()
{
int x=gi(),t=gi();
splay(x,0);
if (t==1)
{
int y=rs[x];
while (ls[y]) y=ls[y];
splay(y,x);
swap(ls[x],ls[y]);if (ls[x]) fa[ls[x]]=x;if (ls[y]) fa[ls[y]]=y;
rs[x]=rs[y];if (rs[x]) fa[rs[x]]=x;
rs[y]=x;fa[x]=y;
fa[root=y]=0;
pushup(x);pushup(y);
}
if (t==-1)
{
int y=ls[x];
while (rs[y]) y=rs[y];
splay(y,x);
swap(rs[x],rs[y]);if (rs[x]) fa[rs[x]]=x;if (rs[y]) fa[rs[y]]=y;
ls[x]=ls[y];if (ls[x]) fa[ls[x]]=x;
ls[y]=x;fa[x]=y;
fa[root=y]=0;
pushup(x);pushup(y);
}
}
void Ask()
{
int x=gi();
splay(x,0);
printf("%d\n",sz[ls[x]]);
}
void Query()
{
int k=gi(),x=root;
while (233)
{
if (k<=sz[ls[x]]) x=ls[x];
else if (k==sz[ls[x]]+1) break;
else k-=sz[ls[x]]+1,x=rs[x];
}
printf("%d\n",x);
}
int Build(int l,int r,int ff)
{
if (l>r) return 0;
int mid=l+r>>1;
fa[a[mid]]=ff;
ls[a[mid]]=Build(l,mid-1,a[mid]);
rs[a[mid]]=Build(mid+1,r,a[mid]);
pushup(a[mid]);
return a[mid];
}
int main()
{
n=gi();m=gi();
for (int i=1;i<=n;i++)
a[i]=gi();
root=Build(1,n,0);
while (m--)
{
scanf("%s",s);
if (s[0]=='T') Top();
if (s[0]=='B') Bottom();
if (s[0]=='I') Insert();
if (s[0]=='A') Ask();
if (s[0]=='Q') Query();
}
return 0;
}

[BZOJ1861][ZJOI2006]书架的更多相关文章

  1. BZOJ1861[Zjoi2006]书架——非旋转treap

    题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些 ...

  2. BZOJ1861:[ZJOI2006]书架(Splay)

    Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ...

  3. [BZOJ1861][Zjoi2006]Book 书架

    [BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ...

  4. [bzoj1861][Zjoi2006]Book 书架_非旋转Treap

    Book 书架 bzoj-1861 Zjoi-2006 题目大意:给你一个序列,支持:将指定编号的元素抽出,放到序列顶(底):将指定编号元素左右篡位:查询指定编号元素位置:查询指定数量位置元素编号. ...

  5. fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架

    题面:P2596 [ZJOI2006]书架 题解:记录每本书对应的节点编号 普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中) ...

  6. 「luogu2569」[ZJOI2006] 书架

    「luogu2569」[ZJOI2006]书架 题目大意 给定一个长度为 \(n\) 序列,序列中第 \(i\) 个元素有编号 \(a_i(a_i \in \Z \cap [1,n])\),需要支持五 ...

  7. 洛谷 P2596 [ZJOI2006]书架 解题报告

    P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...

  8. P2596 [ZJOI2006]书架 && Splay 区间操作(三)

    P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...

  9. [Luogu 2596] ZJOI2006 书架

    [Luogu 2596] ZJOI2006 书架 第一次指针写 FHQ_Treap(省选噩梦数据结构)AC 啦! 省选试机写它,紧张过度失败了. 省选 Day 1 考场写它,写挂了. 省选 Day 1 ...

随机推荐

  1. Halcon一日一练:CAD类型的相关操作

    大很多场合,需要在视觉程序中导入CAD文档,比如,在3C行业,需要对手机外壳进行CNC加工,或者点胶操作,此时,需要获取产品的各个点的数据.如果将CAD直接导入,就会大的减少编程工作量,同时也能达到很 ...

  2. linux 添加静态路由

    Linux下静态路由修改命令方法一:添加路由route add -net 192.168.0.0/24 gw 192.168.0.1route add -host 192.168.1.1 dev 19 ...

  3. [求助][SPOJ MARIOGAM]-高斯消元(内含标程,数据等)

    小蒟蒻开始做概率的题之后,遇到了这道题,然而,他发现自己的程序调试了无数次也无法通过,系统总是返回令人伤心的WA, 于是,他决定把这一天半的时间收集到的资料放在网上, 寻求大家的帮助, 也可以节省后来 ...

  4. 前端开发利器webStorm

    这里推荐一个前端开发工具webStorm.用了大概快半年了,发现所有其他工具无出其右的.目前最新版本已经到4.0.2,半年前还是2.X 相比aptana.dreamweaver.sublime和vim ...

  5. 拥抱.NET Core系列:MemoryCache 初识

    Cache是一个绝大多数项目会用到的一个技术,说起到缓存可能就联想到 Set.Add.Get.Remove.Clear 这几个方法.那么在.NET Core中微软给我们带来了什么样的缓存体验呢?今天我 ...

  6. Ehcache入门基础

    1.ehcache的简介  EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. 2.ehcache入门实例 1.首先先导入 ...

  7. com.mysql.jdbc.Driver和com.mysql.cj.jdbc.Driver的区别

    概述:com.mysql.jdbc.Driver是mysql-connector-java 5中的,而com.mysql.cj.jdbc.Driver是mysql-connector-java 6中的 ...

  8. C/C++语言简介之编程开发

    一.编译器 GCC:GNU组织开发的开源免费的编译器. MinGW:Windows操作系统下的GCC. Clang:开源的BSD协议的基于LLVM的编译器. Visual C++:Microsoft ...

  9. Java中的volatile的作用和synchronized作用

    volatile该关键字是主要使用的场合是字啊多个线程中可以感知实例的变量被更改了并且可以获取到最新的值进行使用,也就是用多线程读取共享变量的时候可以获取到最新的值使用.不能保障原子性 如果你在jvm ...

  10. Yii2整合AdminLTE后台主题

    首先你要确保你已经安装好了Yii2 advanced高级模板,并且跑的通. 安装AdminLTE其实没有网上说的那么简单,网上千篇一律的推荐Composer安装,虽然Composer很方便,但是在中国 ...