1514 书架

题目描述 Description

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

输入描述 Input Description

第一行有两个数 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 Description

对于每一条 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






3

数据范围及提示 Data Size & Hint

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

题解:

神奇的splay!

我觉得刚开始的时候以序号按BST建树,

建好树之后在删除、加入的时候只是人为定义它的位置或者rank,

它的编号已经不代表什么了,而它的编号因为一直不变所以可以为我们做一些事情,比如本题

因此splay也可以回收废节点

。。。语言表达能力有限。。。

哪里说得不对请神牛指出

代码:

 const maxn=+;inf=maxlongint>>;
var i,n,m,x,t,rt:longint;
ch:char;
s,pos,v,fa,a:array[..maxn] of longint;
c:array[..maxn,..] of longint;
procedure pushup(x:longint);
begin
s[x]:=s[c[x,]]+s[c[x,]]+;
end;
procedure rotate(x:longint;var k:longint);
var l,r,y,z:longint;
begin
y:=fa[x];z:=fa[y];
l:=ord(c[y,]=x);r:=l xor ;
if y=k then k:=x else c[z,ord(c[z,]=y)]:=x;
fa[x]:=z;fa[y]:=x;fa[c[x,r]]:=y;
c[y,l]:=c[x,r];c[x,r]:=y;
pushup(y);pushup(x);
end;
procedure splay(x:longint;var k:longint);
var y,z:longint;
begin
while x<>k do
begin
y:=fa[x];z:=fa[y];
if y<>k then
if (c[z,]=y) xor (c[y,]=x) then rotate(x,k)
else rotate(y,k);
rotate(x,k);
end;
end;
function find(x,rank:longint):longint;
var l,r:longint;
begin
l:=c[x,];r:=c[x,];
if s[l]+=rank then exit(x)
else if s[l]>=rank then exit(find(l,rank))
else exit(find(r,rank-s[l]-));
end;
procedure del(k:longint);
var x,y,z:longint;
begin
x:=find(rt,k-);y:=find(rt,k+);
splay(x,rt);splay(y,c[x,]);
z:=c[y,];fa[z]:=;s[z]:=;c[y,]:=;
pushup(y);pushup(x);
end; procedure build(l,r,f:longint);
var mid,now,last:longint;
begin
if l>r then exit;
mid:=(l+r)>>;
now:=mid;last:=f;
fa[now]:=last;v[now]:=a[mid];
c[last,ord(mid>f)]:=now;
if l=r then
begin
s[now]:=;
exit;
end;
build(l,mid-,mid);build(mid+,r,mid);
pushup(now);
end; procedure init;
begin
readln(n,m);
for i:= to n+ do read(a[i]);readln;
for i:= to n+ do pos[a[i]]:=i;
build(,n+,);rt:=(n+)>>;
end;
procedure move(k,val:longint);
var x,y,z,rank:longint;
begin
if val= then exit;
z:=pos[k];splay(z,rt);rank:=s[c[z,]]+;del(rank);
if val=inf then begin x:=find(rt,n);y:=find(rt,n+);end
else if val=-inf then begin x:=find(rt,);y:=find(rt,);end
else begin x:=find(rt,rank+val-);y:=find(rt,rank+val);end;
splay(x,rt);splay(y,c[x,]);
fa[z]:=y;s[z]:=;c[y,]:=z;
pushup(y);pushup(x);
end;
procedure main;
begin
for i:= to m do
begin
read(ch);
case ch of
'T':begin
while ch<>' ' do read(ch);
readln(x);move(x,-inf);
end;
'B':begin
while ch<>' ' do read(ch);
readln(x);move(x,inf);
end;
'I':begin
while ch<>' ' do read(ch);
readln(x,t);move(x,t);
end;
'A':begin
while ch<>' ' do read(ch);
readln(x);
splay(pos[x],rt);writeln(s[c[rt,]]-);
end;
'Q':begin
while ch<>' ' do read(ch);
readln(x);
writeln(v[find(rt,x+)]);
end;
end;
end;
end;
begin
assign(input,'input.txt');assign(output,'output.txt');
reset(input);rewrite(output);
init;
main;
close(input);close(output);
end.

wikioi 1514 and ZJOI2006 书架的更多相关文章

  1. 「luogu2569」[ZJOI2006] 书架

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

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

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

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

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

  4. [Luogu 2596] ZJOI2006 书架

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

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

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

  6. [ZJOI2006]书架(权值splay)

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

  7. [洛谷P2596] [ZJOI2006]书架

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

  8. BZOJ1861:[ZJOI2006]书架

    浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...

  9. luogu2596 [ZJOI2006]书架

    treap.树是以"优先级"(优先级越小,在书架上越靠上)形成的,堆是以rand()的权值形成的.还要再维护一个原编号. 置顶/置底:找到那个元素,把它拉出来修改优先级再塞回去. ...

随机推荐

  1. 2.redis.3.2 下载,安装、配置、使用 - 2

    上篇简单介绍了 下载,安装,测试,现在直接使用了,看结果 使用的redis服务便是,上篇临时搭建的简易服务,,注意,说的是简易,因为它只是一个单点的“玩具”: 临时在项目登录的时候模拟了一下,这里使用 ...

  2. Windows 7中,用Visual Studio开发WPF应用程序,实现从Windows Explorer中拖拽文件到应用程序,始终显示“无法拖放”符号问题解决方案

    Are you running your application or Visual Studio that hosts the app under administrative privilege? ...

  3. java web-----DAO设计模式(数据库访问)

    一,DAO设计模式用于 j2ee 的数据层访问,包括五部分, 数据库连接类(包含数据库的连接与关闭操作的一个类), VO类(私有变量与数据库表格对应,接收数据库中表格各字段内容), DAO接口类(包含 ...

  4. Matlab网格划分

    之前转载了一篇博客http://blog.sina.com.cn/s/blog_6163bdeb0102dvay.html,讲Matlab网格划分程序Distmesh,看了看程序,感觉程序写得有很多值 ...

  5. vs的watch使用

    VC调试器高级应用----WATCH窗口篇 一.格式化数据和表达式赋值语句. 常用变量格式化符(表达式的值后跟逗号,接格式化符,如"(int)0xFFFF,d"):d  :有符号的 ...

  6. 切换到mint了,纪念一下

  7. Java编写的C语言词法分析器

    Java编写的C语言词法分析器 这是java编写的C语言词法分析器,我也是参考很多代码,然后核心代码整理起来,放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手改进.这个词法分析器实现的功能有 ...

  8. SQL Proc(存储过程)/tran(事物)

    存储过程好比C#方法 1.事物写在过程里面,直接调用存储过程 1.1没有参数的过程 /*transaction事物,procedure存储过程*/ create proc CopyTable_1_10 ...

  9. 基于IAccessible接口的QQ窗口信息获取的实现

    这个技术现在已经封装成DLL免费开放给大家使用了,详情请加群221487171 可以访问官方网站下载 http://www.guihelper.com/ 主要技术(Microsoft Active A ...

  10. 列表显示数据 但是数据的字体颜色要js添加

    1.需求:数据在前台显示,但是每个条记录的颜色要有点不同 1.java后台数据的处理 String ids=""; for(int x=0;x<sign.size();x++ ...