题目: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. Centos6.5安装Oracle11.2.0.4 RAC(完整版)

    环境参数:Linux:Centos6.5 Grid和Oracle:11.2.0.4 一.环境配置 1.配置Node1和Node2两个节点之间的网卡 Node1: [root@rac1 network- ...

  2. python基础知识--条件判断和循环

    一.输入输出 python怎么来接收用户输入呢,使用input函数,python2中使用raw_input,接收的是一个字符串,输出呢,第一个程序已经写的使用print,代码入下: 1 name=in ...

  3. msp430入门编程37

    msp430中C语言的可移植--屏蔽实现细节

  4. 洛谷—— P1098 字符串的展开

    https://www.luogu.org/problem/show?pid=1098 题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类 ...

  5. Populating Next Right Pointers in Each Node (DFS,没想到)

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  6. Codechef May Challenge 2015

    随便瞎写,其实没做出多少题: Chef and Cake 题目大概是用输入的数生成 一个数组并且生成出q个[X,Y]的询问, 数组长度N<=1000000,q<=10^7; 开始用线段树, ...

  7. 实现浏览器兼容的innerText

    今天学习到了FF不支持innerText,而IE.chrome.Safari.opera均支持innerText. 为了各个浏览器能兼容innerText,必须对js做一次封装. 为啥能实现兼容呢?原 ...

  8. hdu6215 Brute Force Sorting(模拟)

    题意 给一个长度为n(n<=1e5)的序列,如果一个位置i满足a[i-1]>a[i]或者a[i]>a[i+1],那么我们就称该位置是不合法的位置 先把序列中所有不合法的位置统一找出来 ...

  9. Java的方法

    以下内容引用自http://wiki.jikexueyuan.com/project/java/methods.html: 一个Java方法是为了执行某个操作的一些语句的组合.举个例子来说,当调用Sy ...

  10. react 路由 react-router@3.2.1

    react路由,4.x的差异还是比较大,暂时还是3.x的版本 安装: npm install -S react-router@3.x 配置: import { Router, Route, hashH ...