[bzoj 1861][zjoi2006] 书架
传送门
Description
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本书的编号。
Solution
打算用它练习一下\(fhqTreap\)。
比较烦的是还要记下每个点的\(fa\)指针,才能计算它的排名
各种修改都是\(split\)然后\(merge\)一下就行了,简单
Code
#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
#define MN 80005
class fhqTree
{
private:
int pri[MN],siz[MN],id[MN],fa[MN],ls[MN],rs[MN],val[MN],rt,sz;
inline unsigned int random()
{
static unsigned int x=23333;
return x^=x<<13,x^=x>>17,x^=x<<5;
}
inline int up(int x){if(ls[x])fa[ls[x]]=x;if(rs[x])fa[rs[x]]=x;return siz[x]=siz[ls[x]]+siz[rs[x]]+1;}
inline void Split(int x,int k,int&rt1,int&rt2)
{
if(!x) return(void)(rt1=rt2=0);
if(siz[ls[x]]>=k) Split(ls[x],k,rt1,ls[x]),up(x),rt2=x;
else Split(rs[x],k-siz[ls[x]]-1,rs[x],rt2),up(x),rt1=x;
}
inline int Merge(int rt1,int rt2)
{
if(!(rt1*rt2)) return rt1|rt2;
if(pri[rt1]<pri[rt2]) return rs[rt1]=Merge(rs[rt1],rt2),up(rt1),rt1;
else return ls[rt2]=Merge(rt1,ls[rt2]),up(rt2),rt2;
}
inline void Build(int &x,int l,int r)
{
if(l>r) return;x=++sz;pri[x]=random();
if(l==r) return (void)(siz[x]=1,val[x]=read(),id[val[x]]=x);int mid=(l+r)>>1;
Build(ls[x],l,mid-1);val[x]=read();id[val[x]]=x;Build(rs[x],mid+1,r);up(x);
}
inline int find(int x)
{
#define get(x) (rs[fa[x]]==x)
int res=siz[ls[x]]+1;
for(;(x^rt)&&x;x=fa[x]) if(get(x)) res+=siz[ls[fa[x]]]+1;
return res;
}
inline void Output(int x)
{
if(!x) return;
Output(ls[x]);printf("%d %d\n",val[x],val[fa[x]]);Output(rs[x]);
}
public:
inline void build(int n){Build(rt,1,n);}
inline void output(){Output(rt);puts("");}
inline void Top(int x)
{
register int k=find(id[x]),rt1,rt2,rt3,rt4;
Split(rt,k,rt1,rt2);Split(rt1,k-1,rt3,rt4);
rt=Merge(rt4,Merge(rt3,rt2));
}
inline void Bottom(int x)
{
register int k=find(id[x]),rt1,rt2,rt3,rt4;
Split(rt,k,rt1,rt2);Split(rt1,k-1,rt3,rt4);
rt=Merge(rt3,Merge(rt2,rt4));
}
inline void Move(int x,int T)
{
if(!T) return;
register int k=find(id[x]),rt1,rt2,rt3,rt4,rt5,rt6;
Split(rt,k,rt1,rt2);Split(rt1,k-1,rt3,rt4);
if(T>0) Split(rt2,1,rt5,rt6),rt=Merge(rt3,Merge(rt5,Merge(rt4,rt6)));
else Split(rt3,k-2,rt5,rt6),rt=Merge(rt5,Merge(rt4,Merge(rt6,rt2)));
}
inline void Ask(int x){printf("%d\n",find(id[x])-1);}
inline void Query(int k)
{
register int rt1,rt2,rt3,rt4;
Split(rt,k,rt1,rt2);Split(rt1,k-1,rt3,rt4);
printf("%d\n",val[rt4]);rt=Merge(rt3,Merge(rt4,rt2));
}
}T;
int main()
{
register int x,n=read(),m=read(),i;T.build(n);
register char s[20];
while(m--)
{
scanf("%s",s);x=read();
if(s[0]=='T') T.Top(x);
if(s[0]=='B') T.Bottom(x);
if(s[0]=='I') T.Move(x,read());
if(s[0]=='A') T.Ask(x);
if(s[0]=='Q') T.Query(x);
}
return 0;
}
Blog来自PaperCloud,未经允许,请勿转载,TKS!
[bzoj 1861][zjoi2006] 书架的更多相关文章
- 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)
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1453 Solved: 822[Submit][Stat ...
- [题解]bzoj 1861 Book 书架 - Splay
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1396 Solved: 803[Submit][Stat ...
- BZOJ 1861: [Zjoi2006]Book 书架 | SPlay 板题
#include<cstdio> #include<algorithm> #include<cstring> #define N 80010 #define whi ...
- BZOJ 1861 [Zjoi2006]Book 书架 ——Splay
[题目分析] 模板题目. 首尾两个虚拟结点,十分方便操作. [代码] #include <cstdio> #include <cstring> #include <cma ...
- 「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在看书的时候,每次取出一本书, ...
随机推荐
- jmeter中生成UUID作为唯一标识符
在测试过程中,我们有时候需要一个唯一不重复的值(比如order_id).我之前一直用的时间戳+计数器/随机函数拼接,但是有时候效果不太好,今天知道了UUID这玩意,可以来操作下.jmeter也提供了U ...
- element-ui 页面刷新自动弹Message问题
问题: 通过加载插件的方式引入Message,导致每次页面刷新的时候会自动弹出一个通知消息 该情况只在引入局部插件才会引起 import Vue from 'vue' import 'element- ...
- FLV 数据封装格式
https://www.cnblogs.com/chyingp/p/flv-getting-started.html https://blog.csdn.net/ai2000ai/article/de ...
- axios拦截登陆过期请求多次
request.interceptors.response.use( response => { console.log(response.data.code) // console.log(r ...
- python+django早教课程
虚拟环境安装项目中需要安装许多插件,为不影响系统的环境,可以为项目新建一个虚拟环境,所有的早教课程安装包在该虚拟环境中独有,以防影响其他项目.1. 安装虚拟环境:pip install virtual ...
- Axure总结
https://blog.csdn.net/xlegendxblog/article/details/54378705 1.常用符号 2.箭头的绘制 3.绘制流程图基本要点:流程路径不要交叉 4.对复 ...
- PAT基础级-钻石段位样卷2-7-2 吃鱼还是吃肉 (10 分)
国家给出了 8 岁男宝宝的标准身高为 130 厘米.标准体重为 27 公斤:8 岁女宝宝的标准身高为 129 厘米.标准体重为 25 公斤. 现在你要根据小宝宝的身高体重,给出补充营养的建议. 输 ...
- P1080 【NOIP 2012】 国王游戏[贪心+高精度]
题目来源:洛谷 题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王 ...
- 【Java】《Java程序设计基础教程》第一章学习
一.Java概述 1.介绍了Java语言的由来 2.Java语言的特点:简单.面向对象.分布式.高效解释执行.健壮.安全.结构中立.可移植.高效率.多线程.动态 3.Java语言的实现机制,引入虚拟机 ...
- P2P system: Introduction
P2P system : peer-to-peer system 一些流行的P2P system: Napster, Gnutella 我们为什么研究P2P system 大型的分布式系统有成千上万个 ...