bzoj1861 [Zjoi2006]Book 书架——splay
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1861
发现自己想splay的时候总是纠结那个点权是什么,因为splay原本是二分查找树...
但其实splay已经不是维护点权大小顺序的,它的最大作用就在于无论怎样旋转都保持着中序遍历这个相对位置不变;
所以很对应这道题,用splay进行各种操作的同时书的摆放顺序是不变的;
假设出一个‘1’点、一个‘n+1’点方便操作,所以整体+1;
这个建树的方法不错呢。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int const maxn=,inf=0x3f3f3f3f;
int n,m,rt,a[maxn],pos[maxn],v[maxn],c[maxn][],siz[maxn],fa[maxn];
void pushup(int x){siz[x]=siz[c[x][]]+siz[c[x][]]+;}
void build(int l,int r,int f)
{
if(l>r)return;
if(l==r)
{
v[l]=a[l];siz[l]=;fa[l]=f;
// if(l<f)c[f][0]=l;else c[f][1]=l;
c[f][(l>f)]=l;
return;
}
int mid=((l+r)>>);
build(l,mid-,mid);build(mid+,r,mid);
v[mid]=a[mid];fa[mid]=f;
// if(mid<f)c[f][0]=mid;else c[f][1]=mid;
c[f][(mid>f)]=mid;
pushup(mid);
}
void rotate(int x,int &k)
{
int y=fa[x],z=fa[y];
int d=(c[y][]==x);
if(y==k)k=x;
else c[z][(c[z][]==y)]=x;
fa[x]=z;fa[y]=x;fa[c[x][d^]]=y;
c[y][d]=c[x][d^];c[x][d^]=y;
pushup(y);pushup(x);
}
void splay(int x,int &k)
{
while(x!=k)
{
int y=fa[x],z=fa[y];
if(y!=k)
{
if((c[y][]==x)^(c[z][]==y))rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
int find(int x,int rank)
{
int l=c[x][],r=c[x][];
if(rank==siz[l]+)return x;
else if(rank<=siz[l])return find(l,rank);
else return find(r,rank-siz[l]-);
}
void del(int k)
{
int x=find(rt,k-),y=find(rt,k+);
splay(x,rt);splay(y,c[x][]);
int z=c[y][];c[y][]=;siz[z]=;fa[z]=;
pushup(y);pushup(x);
}
void move(int k,int val)
{
int x,y,z=pos[k],rank;
splay(z,rt);rank=siz[c[z][]]+;
del(rank);
if(val==-inf)x=find(rt,),y=find(rt,);
else if(val==inf)x=find(rt,n),y=find(rt,n+);//else if而非if!!! //del后有n-1本书
else x=find(rt,rank+val-),y=find(rt,rank+val);
splay(x,rt);splay(y,c[x][]);
c[y][]=z;siz[z]=;fa[z]=y;
pushup(y);pushup(x);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n+;i++)
scanf("%d",&a[i]),pos[a[i]]=i;
build(,n+,);rt=(n+)/;//+'1'
char ch[];
for(int i=,x,T;i<=m;i++)
{
scanf("%s",&ch);scanf("%d",&x);
if(ch[]=='T')move(x,-inf);//top
if(ch[]=='B')move(x,inf);//bottom
if(ch[]=='I')scanf("%d",&T),move(x,T);
if(ch[]=='A')splay(pos[x],rt),printf("%d\n",siz[c[pos[x]][]]-);//'1'
if(ch[]=='Q')printf("%d\n",v[find(rt,x+)]);//'1'
}
return ;
}
bzoj1861 [Zjoi2006]Book 书架——splay的更多相关文章
- bzoj1861 [Zjoi2006]Book 书架 splay
小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引 ...
- [BZOJ1861][Zjoi2006]Book 书架
[BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ...
- [bzoj1861][Zjoi2006]Book 书架_非旋转Treap
Book 书架 bzoj-1861 Zjoi-2006 题目大意:给你一个序列,支持:将指定编号的元素抽出,放到序列顶(底):将指定编号元素左右篡位:查询指定编号元素位置:查询指定数量位置元素编号. ...
- BZOJ 1861: [Zjoi2006]Book 书架 splay
1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书 ...
- fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架
题面:P2596 [ZJOI2006]书架 题解:记录每本书对应的节点编号 普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中) ...
- 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 ...
- 并不对劲的bzoj1861: [Zjoi2006]Book 书架
传送门-> 这题的正确做法是splay维护这摞书. 但是并不对劲的人选择了暴力(皮这一下很开心). #include<algorithm> #include<cmath> ...
- BZOJ1861[ZJOI2006]Book书架
Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ...
随机推荐
- 【dp】D. Caesar's Legions
https://www.bnuoj.com/v3/contest_show.php?cid=9146#problem/D [题意]给定n1个A,n2个B,排成一排,要求A最多能连续k1个紧挨着,B最多 ...
- [转]GitHub 优秀的 Android 开源项目
GitHub 优秀的 Android 开源项目 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageV ...
- 调用BOS服务保存一个单据的简化示例
IMetaDataService metadataService = ServiceHelper.GetService<IMetaDataService>(); // 加载元数据 Form ...
- 牛客网暑期ACM多校训练营(第九场)D
链接:https://www.nowcoder.com/acm/contest/147/D来源:牛客网 Niuniu likes traveling. Now he will travel on a ...
- poj -1185 炮兵阵地 (经典状压dp)
http://poj.org/problem?id=1185 参考博客:http://poj.org/problem?id=1185 大神博客已经讲的很清楚了,注意存状态的时候是从1开始的,所以初始化 ...
- hdu 3237
dp 状态压缩 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> ...
- final finally finalize 区别及用法
final 1,final修饰的class,代表不可以继承扩展. 2.final的方法也是不可以重写的. 3.final修饰的变量是不可以修改的.这里所谓的不可修改对于基本类型来来,的确是不可以修改. ...
- mysql.bat
cls @echo off :设置窗口字体颜色 color 0a :设置窗口标题 TITLE MySQL管理程序 call :checkAdmin goto menu :菜单 :men ...
- Spring Boot使用HandlerInterceptorAdapter和WebMvcConfigurerAdapter实现原始的登录验证
HandlerInterceptorAdapter的介绍:http://www.cnblogs.com/EasonJim/p/7704740.html,相当于一个Filter拦截器,但是这个颗粒度更细 ...
- 初探无线安全审计设备WiFi Pineapple Nano系列之PineAP
前言: 之前曾经介绍过国外无线安全审计设备The WiFi Pineapple Nano的SSLsplit模块和ettercap模块及实验. 在玩WiFi Pineapple Nano 设备的过程中, ...