题目: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的更多相关文章

  1. bzoj1861 [Zjoi2006]Book 书架 splay

    小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引 ...

  2. [BZOJ1861][Zjoi2006]Book 书架

    [BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ...

  3. [bzoj1861][Zjoi2006]Book 书架_非旋转Treap

    Book 书架 bzoj-1861 Zjoi-2006 题目大意:给你一个序列,支持:将指定编号的元素抽出,放到序列顶(底):将指定编号元素左右篡位:查询指定编号元素位置:查询指定数量位置元素编号. ...

  4. BZOJ 1861: [Zjoi2006]Book 书架 splay

    1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书 ...

  5. fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架

    题面:P2596 [ZJOI2006]书架 题解:记录每本书对应的节点编号 普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中) ...

  6. BZOJ 1861: [Zjoi2006]Book 书架 | SPlay 板题

    #include<cstdio> #include<algorithm> #include<cstring> #define N 80010 #define whi ...

  7. BZOJ 1861 [Zjoi2006]Book 书架 ——Splay

    [题目分析] 模板题目. 首尾两个虚拟结点,十分方便操作. [代码] #include <cstdio> #include <cstring> #include <cma ...

  8. 并不对劲的bzoj1861: [Zjoi2006]Book 书架

    传送门-> 这题的正确做法是splay维护这摞书. 但是并不对劲的人选择了暴力(皮这一下很开心). #include<algorithm> #include<cmath> ...

  9. BZOJ1861[ZJOI2006]Book书架

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

随机推荐

  1. hdu 3879 最大权闭合图(裸题)

    /* 裸的最大权闭合图 解:参见胡波涛的<最小割模型在信息学竞赛中的应用 #include<stdio.h> #include<string.h> #include< ...

  2. jmesa应用

    一直以来,都没发现什么好的分页组件,最初时用过displaytag,仔细研究了一下,发现它并没有别人说的那么强大,至少离自己的期望还很远,因此尝试寻找其它新的分页组件,但很久以来都没发现自己满意的.无 ...

  3. BZOJ1775: [Usaco2009 Dec]Vidgame 电视游戏问题

    n<=50个游戏机有花费,每个游戏机有Gi<=10种游戏,每种游戏有花费有收益,买了游戏机才能玩对应游戏,求最大收益. 这就是一个背包!不过有依存关系,就不会了! 方法一:f[i][j]表 ...

  4. poj1273最大流初破

    第一次网络流,学了一天的DINIC算法(个人比较愚),切了这个入门题,开始的时候怎么调连 测试都过不了,后来发现犯了一个低级错误!把判断条件放在for(:)!里面和放在for下面大大 不同啊!里面的话 ...

  5. Java处理XSS漏洞的工具类代码

    原文:http://www.open-open.com/code/view/1455809388308 public class AntiXSS { /** * 滤除content中的危险 HTML ...

  6. TeamCity - Docker创建

    // 创建Server docker run -it --name teamcity-server-instance \-v /home/tc_datadir:/data/teamcity_serve ...

  7. 分析PMT changed for the ROM:it must be downloaded.升级失败。

    应用场景描写叙述: 同样项目不同版本号(不同分支),使用Smart Phone Flash Tool工具交叉升级,出现PMT changed for the ROM;it must be downlo ...

  8. 用"再生龙"Clonezilla 来克隆Linux系统

      上周公司买了5套高配置PC机来做测试用.上面要装好CentOS 加上一堆工具,有web的,数据库的,还有一些自己开发的工具.有些朋友肯定想,直接用kickstart不就行了,确实.kickstar ...

  9. Tomcat-公布WEB应用

    1.定义Context 进入管理WEB应用的URL是http://localhost:8080/manager/html. username与password的设置:打开tomcat安装文件夹中的co ...

  10. Windows-安装composer

    安装laravel之前必须先安装componser,点击:下载Windows安装程序 全部下一步,直到完成 目前,遇到过两个问题(国内防火墙) 还有就是Win10不支持PHP+Composer的组合, ...