追yql做题记录的时候做到的……一道Splay模版题……

啊LCT写久了都有点忘了Splay了(什么奇怪的逻辑?)

其实说白了五个操作:

1、 将某元素置顶:将元素旋到根,然后将左子树合并到该元素的后继

2、 将某元素置底:将元素旋到根,然后将右子树合并到该元素的前驱

3、 将某元素提前/滞后1位:直接与该元素的前驱/后继交换位置及信息

4、 询问指定元素排名:将元素旋到根,输出size-1

5、 询问指定排名元素:在树上find

不好,我……我发现……我还在写数据结构!

 #include<bits/stdc++.h>
#define N 80005
#define inf 1000000007
using namespace std;
int n,m,a[N],sz,pos[N];
struct Splay_Tree{
int c[N][],fa[N],dep[N],size[N],val[N],rt;
inline void pushup(int x){size[x]=size[c[x][]]+size[c[x][]]+;}
inline void rotate(int x,int &k){
int y=fa[x],z=fa[y],l,r;
if(c[y][]==x)l=;else l=;r=l^;
if(y==k)k=x;
else {if(c[z][]==y)c[z][]=x;else c[z][]=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);
}
inline void splay(int x,int &k){
while(k!=x){
int y=fa[x],z=fa[y];
if(y!=k){
if((c[z][]==y)^(c[y][]==x))rotate(x,k);
else rotate(y,k);
}rotate(x,k);
}
}
void build(int l,int r,int f){
if(l>r)return;
int now=l,last=f;
if(l==r){
val[l]=a[l];size[l]=;fa[l]=f;
if(l<f)c[f][]=l;else c[f][]=l;
}
int mid=(l+r)>>;
build(l,mid-,mid);build(mid+,r,mid);
val[mid]=a[mid];fa[mid]=f;pushup(mid);
if(mid<f)c[f][]=mid;else c[f][]=mid;
}
int find(int k,int x){
int l=c[k][],r=c[k][];
if(size[l]+==x)return k;
else if(size[l]>=x)return find(l,x);
else return find(r,x-size[l]-);
}
void del(int k){
int x=find(rt,k-),y=find(rt,k+),z;
splay(x,rt);splay(y,c[x][]);
z=c[y][];c[y][]=;fa[z]=size[z]=;
pushup(y);pushup(x);
}
void move(int k,int v){
int x,y,z=pos[k],rk;
splay(z,rt);rk=size[c[z][]]+;
del(rk);
if(v==inf)x=find(rt,n),y=find(rt,n+);
else if(v==-inf)x=find(rt,),y=find(rt,);
else x=find(rt,rk+v-),y=find(rt,rk+v);
splay(x,rt);splay(y,c[x][]);
size[z]=;fa[z]=y;c[y][]=z;
pushup(y);pushup(x);
}
}Splay;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();m=read();
for(int i=;i<=n+;i++)a[i]=read(),pos[a[i]]=i;
Splay.build(,n+,);Splay.rt=(n+)>>;
char s[];int x,y;
while(m--){
scanf("%s",s);x=read();
switch(s[]){
case 'T':Splay.move(x,-inf);break;
case 'B':Splay.move(x,inf);break;
case 'I':y=read();Splay.move(x,y);break;
case 'A':Splay.splay(pos[x],Splay.rt);printf("%d\n",Splay.size[Splay.c[pos[x]][]]-);break;
case 'Q':printf("%d\n",Splay.val[Splay.find(Splay.rt,x+)]);break;
}
}
return ;
}

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. wikioi 1514 and ZJOI2006 书架

    1514 书架 0人推荐 收藏 发题解 提交代码 报错 题目描述 输入描述 输出描述 样例输入 样例输出 提示 题目描述 Description 小 T有一个很大的书柜.这个书柜的构造有些独特,即书柜 ...

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

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

  9. BZOJ1861:[ZJOI2006]书架

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

  10. luogu2596 [ZJOI2006]书架

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

随机推荐

  1. VM实例的生命周期管理

    有的操作功能比较类似,也有各自的适用场景,简单介绍下上述几个重要的操作: 常规操作: 常规操作中,Launch.Start.Reboot.Shut Off 和 Terminate 都很好理解. 下面几 ...

  2. POJ 1703 Find them, Catch them(并查集拓展)

    Description The police office in Tadu City decides to say ends to the chaos, as launch actions to ro ...

  3. DPDK 网卡RSS(receive side scaling)简介

    网卡RSS(receive side scaling)简介 RSS是一种网卡驱动技术,能让多核系统中跨多个处理器的网络收包处理能力高效能分配.注意:由于同一个核的处理器超线程共享同一个执行引擎,这个效 ...

  4. Oracle解决索引碎片功能

    我们开始时向一个空的带索引的表中插入大量数据后,是不会产生碎片问题的,但是,数据库经过很长一段时间的增删改查后,难免会出现碎片问题,影响数据库的性能,Oracle对于这一问题有自己的解决方案. 下面介 ...

  5. 【bzoj1806】[Ioi2007]Miners 矿工配餐 dp

    题目描述 有n个物品,每个都是3种之一.现要将这n个物品分成两个序列,对于每个序列中的每个物品,可以得到 它及它前面相邻的两个物品(不足则取全部)中不同种类的个数 的收益.问最大的总收益. 输入 输入 ...

  6. WIndows 相关知识

    Windows服务 图解WinXP局域网共享设置步骤 Win10如何搭建FTP服务器以实现快速传输文件 强大工具psexec工具用法简介 BIOS和CMOS的区别 系统CLSID简介和小技巧

  7. var result = eval('(' + data + ')');的学习

    $.post("url", function(data) { //这里的function(data)这里的data是前端页面获取的后台的返回的数据: var result = ev ...

  8. 1、linux下mysql5.5.20安装过程报错汇总

    1.Access denied for user 'root'@'localhost' (using password: YES) 这个提示是因为root帐户默认不开放远程访问权限,所以需要修改一下相 ...

  9. JS遮罩层弹框效果

    对于前端开发者来说,js是不可缺少的语言.现在我开始把我日常积累的一些js效果或者通过搜索自己总结的一些效果分享给大家,希望能够帮助大家一起进步,也希望大家能够多多支持! 1.今天我先分享一个遮罩层弹 ...

  10. 着色方案(bzoj 1079)

    Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木 ...