BZOJ1861[ZJOI2006]Book书架
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
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
9
9
7
5
3
HINT
题解:
题目要求支持在数列中移动、询问元素,平衡树毫无疑问可以解决这种问题。但是,区间线段树也可以解决这个问题。
每个线段树节点记录对应的区间里有多少本书,则询问操作变成了单点访问、区间求和。
因为该题的操作只有交换相邻、把某个元素放到最前、把某个元素放到最后三种,所有书所占用的区间左右段点最多向外移动m,可以开n+2*m的区间来解决。
注意记录每本书在哪个位置、某个位置有什么书,移动时记得更新。
代码:
var
i,j,k,l,y,n,m,ls,rs,cnt:longint;
t:array[..,-..]of longint;
wz,bh:array[..]of longint;
ch,ch2:char;
procedure build(l,r,fa:longint);
var x:longint;
begin
inc(cnt); x:=cnt; t[x,]:=l; t[x,]:=r;
if t[x,]=t[fa,] then t[fa,-]:=x else t[fa,-]:=x;
if l=r then
begin
if bh[l]> then t[x,]:=;
exit;
end;
build(l,(l+r)div ,x); build((l+r)div +,r,x);
t[x,]:=t[t[x,-],]+t[t[x,-],];
end;
procedure work(x,y,z:longint);
begin
t[x,]:=t[x,]+z;
if t[x,]=t[x,] then exit;
if y<=(t[x,]+t[x,])div then work(t[x,-],y,z)
else work(t[x,-],y,z);
end;
function qq(x,l,r:longint):longint;
var ll,rr:longint;
begin
if(t[x,]=l)and(t[x,]=r)then exit(t[x,]);
ll:=t[x,]; rr:=t[x,];
if r<=(ll+rr)div then exit(qq(t[x,-],l,r))
else if l>(ll+rr)div then exit(qq(t[x,-],l,r))else
exit(qq(t[x,-],l,(ll+rr)div )+qq(t[x,-],(ll+rr)div +,r));
end;
function qq2(y:longint):longint;
var k,l:longint;
begin
k:=;
while t[k,]<>t[k,] do
begin
l:=t[k,-];
if t[l,]>=y then k:=l
else begin y:=y-t[l,]; k:=t[k,-]; end;
end;
exit(bh[t[k,]]);
end;
begin
readln(n,m);
for i:= to n do
begin
read(j);
bh[i+]:=j;
wz[j]:=i+;
end;
readln;
ls:=; rs:=+n+;
build(,+n+,);
for i:= to m do
begin
read(ch);
read(ch2);
while ch2<>' ' do read(ch2);
if ch='Q' then
begin
readln(j); writeln(qq2(j));
end else
if ch='T' then
begin
readln(j);
work(,wz[j],-);
work(,ls,); bh[wz[j]]:=; wz[j]:=ls; bh[ls]:=j; dec(ls);
end else
if ch='B' then
begin
readln(j);
work(,wz[j],-);
work(,rs,); bh[wz[j]]:=; wz[j]:=rs; bh[rs]:=j; inc(rs);
end else
if ch='A' then
begin
readln(j);
writeln(qq(,,wz[j]-));
end else
begin
readln(j,k);
if k= then continue;
l:=qq(,,wz[j]);
l:=qq2(l+k);
y:=wz[j]; wz[j]:=wz[l]; wz[l]:=y;
y:=bh[wz[j]]; bh[wz[j]]:=bh[wz[l]]; bh[wz[l]]:=y;
end;
end;
end.
BZOJ1861[ZJOI2006]Book书架的更多相关文章
- [BZOJ1861][Zjoi2006]Book 书架
[BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ...
- [bzoj1861][Zjoi2006]Book 书架_非旋转Treap
Book 书架 bzoj-1861 Zjoi-2006 题目大意:给你一个序列,支持:将指定编号的元素抽出,放到序列顶(底):将指定编号元素左右篡位:查询指定编号元素位置:查询指定数量位置元素编号. ...
- fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架
题面:P2596 [ZJOI2006]书架 题解:记录每本书对应的节点编号 普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中) ...
- 【平衡树】【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 ...
- bzoj1861 [Zjoi2006]Book 书架 splay
小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引 ...
- 并不对劲的bzoj1861: [Zjoi2006]Book 书架
传送门-> 这题的正确做法是splay维护这摞书. 但是并不对劲的人选择了暴力(皮这一下很开心). #include<algorithm> #include<cmath> ...
- bzoj1861 [Zjoi2006]Book 书架——splay
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1861 发现自己想splay的时候总是纠结那个点权是什么,因为splay原本是二分查找树... ...
- BZOJ 1861: [Zjoi2006]Book 书架
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1290 Solved: 740[Submit][Stat ...
随机推荐
- redis-BOOK
https://www.gitbook.com/book/gnuhpc/redis-all-about/details
- How Network Load Balancing Technology Works--reference
http://technet.microsoft.com/en-us/library/cc756878(v=ws.10).aspx In this section Network Load Balan ...
- 敏捷软件工程(agile software development) VS传统软件工程(traditional software development)
敏捷软件工程(agile software development) VS传统软件工程(traditional software development) Agile principle ...
- [转]使用Beaglebone Black的SPI
分类: Beaglebone Black2013-11-24 18:21 678人阅读 评论(6) 收藏 举报 beaglebone blackbeagleboneSPIdevice tree 目 ...
- 考试必备神器-真题园手机客户端Android版1.1正式上线啦,欢迎大家下载使用!
真题园-考试必备神器,爱学习,找真题! 真题园-考试必备神器,爱学习,找真题!1.真题园android客户端1.1版全新发布上线.2.最新教育资讯实时更新,了解行业动态新闻.3.最新最全的真题大全,最 ...
- 从数组中随机取n条不重复的数据
工作中经常遇到有关数组的一些操作 1. 从数据中随机取n条不重复的数据 (PS:下面的S.each是KISSY.each方法,大家可以改为for循环) /* 1 从数组arr中随机取n条不重复的数据 ...
- Smokeping 监控部署及配置
安装参见: https://github.com/oetiker/SmokePing/blob/master/doc/smokeping_install.pod 1 Smokeping *** Gen ...
- Verilog Tips and Interview Questions
Verilog Interiew Quetions Collection : What is the difference between $display and $monitor and $wr ...
- euqals和hashcode
hashcode这个方法是用来鉴定2个对象是否相等的. 那你会说,不是还有equals这个方法吗? 不错,这2个方法都是用来判断2个对象是否相等的.但是他们是有区别的. 一般来讲,equals这个方法 ...
- 图解JVM在内存中申请对象及垃圾回收流程
http://longdick.iteye.com/blog/468368 先看一下JVM的内存模型: 从大的方面来讲,JVM的内存模型分为两大块: 永久区内存( Permanent space )和 ...