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在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ...
随机推荐
- msp430项目编程11
msp430中项目---步进电机控制系统 1.步进电机工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习
- php 之 日志系统seaslog安装
php 之 日志系统seaslog 特点: 1.高性能(使用C语言编写的). 2.无需配置. 3.功能完善.使用简单. 安装: 打开php的扩展官网:https://pecl.php.net/. 然后 ...
- Knockout.js用jquery的val设置值不更新
用如下方法,加上change() .val("blah").change()
- 转:String数组初始化
近日,笔者在java编程中因为疏忽对String数组的初始化定义错误,导致程序运行出错.现将所理解的String数组在此进行说明,并对String数组初始化进行分析. //一维数组String[] s ...
- jenkins的构建日志(console output)分类解析
每个jenkins的job构建过程中会产生大量日志,如何快速找到或者查看我们关心的日志显得很有意义,为此jenkins提供了一个插件“Log Parser Plugin”可以帮助我们完成这个任务. 1 ...
- Openwrt挂载NTFS硬盘提示“只读”错误的解决方法!
Openwrt是基于Linux代码编写,只支持NTFS格式硬盘的只读权限,否则当挂载的NTFS硬盘写入超过2M左右,就会出现"error:read-only file system" ...
- centos 安装python2.7
安装pip sudo yum -y install epel-release sudo yum -y install python-pip 下载解压Python-2.7.3 #wget http:// ...
- HTC 328T 如何恢复出厂设置
设置-存储-恢复出厂设置(在存储的最下面,往下拉)
- Guava ---- Concurrent并发
Guava在JDK1.5的基础上, 对并发包进行扩展. 有一些是易用性的扩展(如Monitor). 有一些是功能的完好(如ListenableFuture). 再加上一些函数式编程的特性, 使并发包的 ...
- 微信小程序之 Tabbar(底部选项卡)
1.项目目录 2.在app.json里填写:tab个数范围2-5个 app.json { "pages": [ "pages/index/index", &qu ...