wikioi 1514 and ZJOI2006 书架
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
2
9
9
7
5
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 书架的更多相关文章
- 「luogu2569」[ZJOI2006] 书架
「luogu2569」[ZJOI2006]书架 题目大意 给定一个长度为 \(n\) 序列,序列中第 \(i\) 个元素有编号 \(a_i(a_i \in \Z \cap [1,n])\),需要支持五 ...
- 洛谷 P2596 [ZJOI2006]书架 解题报告
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
- P2596 [ZJOI2006]书架 && Splay 区间操作(三)
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
- [Luogu 2596] ZJOI2006 书架
[Luogu 2596] ZJOI2006 书架 第一次指针写 FHQ_Treap(省选噩梦数据结构)AC 啦! 省选试机写它,紧张过度失败了. 省选 Day 1 考场写它,写挂了. 省选 Day 1 ...
- fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架
题面:P2596 [ZJOI2006]书架 题解:记录每本书对应的节点编号 普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中) ...
- [ZJOI2006]书架(权值splay)
[ZJOI2006]书架(luogu) Description 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看 ...
- [洛谷P2596] [ZJOI2006]书架
洛谷题目链接:书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后 ...
- BZOJ1861:[ZJOI2006]书架
浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...
- luogu2596 [ZJOI2006]书架
treap.树是以"优先级"(优先级越小,在书架上越靠上)形成的,堆是以rand()的权值形成的.还要再维护一个原编号. 置顶/置底:找到那个元素,把它拉出来修改优先级再塞回去. ...
随机推荐
- cognos10.2.2使用ODBC连接oracle92数据库(BMT-IMP-0016)
对于Cognos Server 64位Windows系统,注意!请下载32位程序.即: 因为Cognos只认32位ODBC程序.这里千万要注意.对于64位的Windows系统的ODBC有两个程序, ...
- RPC实现原理(HSF、dubbo) 从头开始(一)
前言 阔别了很久博客园,虽然看了以前写的很多东西感觉好幼稚,但是还是觉得应该把一些自己觉得有用的东西和大家分享.废话不多说,现在开始进入正题. 之前的六年工作经验,呆过了一些大公司,每个在大公司呆过的 ...
- 04_过滤器Filter_05_Filter解决全站中文乱码问题(POST方式)
[工程截图] [web.xml] <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns: ...
- AJAX原理及优缺点
1.ajax技术的背景 不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth.google suggest以及gmail等对ajax技术的广泛应用,催生了ajax ...
- go build 时报错 cc1.exe: sorry, unimplemented: 64-bit mode not compiled in
最近在玩Go win下尝试编译Go的时候遇到了下面提示(可能是gorocksdb用到了gcc) gcc也需要64位的 最后找到了个帖子: https://github.com/mattn/go-sql ...
- html5 canvas绘制圆形印章,以及与页面交互
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- yii2 AR需要注意的地方
$model::find(['id'=>1])->one();和$model::findOne(1); 返回的都是一个Obj不能使用foreach遍历,其他都是返回对象数组可以用forea ...
- Lighttpd日志打印格式
检查lighttpd打印的日志时,有些字段意义模糊,就找了个对照说明,备份一下 原文地址:http://redmine.lighttpd.net/projects/1/wiki/Docs_ModAcc ...
- PHP构造函数的用法分析
PHP构造函数的声明与其它操作的声明一样,只是其名称必须是__construct( ).这是PHP5中的变化,以前的版本中,构造函数的名称必须与类名相同,这种在PHP5中仍然可以用,但现在以经很少有人 ...
- PHP面向对象的特性
1.抽象性2.封装性3.继承extends4.多态