题目: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. PTA 03-树2 List Leaves (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/666 5-4 List Leaves   (25分) Given a tree, you ...

  2. ajax请求数据之后在已经有的数据前面打对勾的方法

    今天遇到这么一个需求: 选择一部分人,在点击确定的时候添加到对应的div中,也就是添加到对应的表单下面,当再次查询的时候需要在已经选过的人的复选框前面打伤对勾.

  3. 7.1——函数的定义,参数传递,return语句

    函数的定义: (1)函数体是一个作用域,函数体是一个语句块,定义了函数的具体操作 (2)函数的形参类似于局部变量,只是区别是它是在函数的形参列表中定义的. (3)C++是一种静态强类型语言,对于每一次 ...

  4. 通过复制现有的redhat虚拟机的文件,实现在VMWare8.0上重建一个新的redhat虚拟机环境

    1.将需要复制的redhat虚拟机的文件都存放在一个新的文件夹redhat下,因为虚拟机很大,所以复制可能花费较长的时间. 2.复制完成后,打开VMWare,选择“Open a Virtual Mac ...

  5. Windows Server 2003的一些优化设置 (转至网络)

    2003序列号:JCHKR-888KX-27HVK-DT88X-T767M1.禁用配置服务器向导: 禁止“配置你的服务器”(Manage Your Server)向导的出现:在控制面板(Control ...

  6. OC-runtime 的温习

    -.runtime简介 runtime简称运行时,OC就是运行时机制,也就是运行时的一些机制,其中最主要的是消息机制: 对于C语言,函数的调用在编辑的时候,会决定调用哪个函数: 对于OC的函数,属于动 ...

  7. oc温习五:字符串

    /** substringFromIndex: --从第from位数 开始截取字符串 */ NSString *str = @"asdfghjkzxcbnm"; NSString ...

  8. 进入一个jsp直接跳到另一个jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  9. java基础编程题

    1. 某公司每月标准上班时间是160小时,每小时工资是30元. 如果上班时间超出了160小时,超出部分每小时按1.5倍工资发放.请编写程序计算员工月工资. package com.num2.lianx ...

  10. Spring中基于AOP的XML架构

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/aop-with-spring-framenwork/xml-schema-based-aop-wi ...