bzoj1861 [Zjoi2006]Book 书架 splay
Input
Output
Sample Input
1 3 2 7 5 8 10 4 9 6
Query 3
Top 5
Ask 6
Bottom 3
Ask 3
Top 6
Insert 4 –1
Query 5
Query 2
Ask 2
Sample Output
9
9
7
5
3
数据范围
30%的数据,n,m < = 10000
100%的数据,n,m < = 80000
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring> using namespace std; const int NN=,inf=1e9+; int n,m,rt,sz;
int c[NN][],fa[NN],deep[NN];
int a[NN],size[NN],v[NN],pos[NN]; void update(int k)//仅仅用来得到k的大小
{
size[k]=size[c[k][]]+size[c[k][]]+;
}
void rotate(int x,int &k)//一次旋转
{
int y=fa[x],z=fa[y],l,r;
if (c[y][]==x) l=;
else l=;
r=l^;
if (y==k) k=x;
else if (c[z][]==y) c[z][]=x;
else c[z][]=x;
fa[x]=z,fa[y]=x,fa[c[x][r]]=y;
c[y][l]=c[x][r],c[x][r]=y;
update(y),update(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)//这个是判断zig还是zag,来决定谁先交换。
rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
void build(int l,int r,int f)//l,r是表示区间,f表示根
{
if (l>r) return;
int now=l,last=f;
if (l==r)
{
v[now]=a[l],size[now]=,fa[now]=last;
if (l<f) c[last][]=now;//右边左边的问题
else c[last][]=now;
return;
}
int mid=(l+r)>>;
now=mid;
build(l,mid-,mid);build(mid+,r,mid);
v[now]=a[mid],fa[now]=last;
update(now);
if (mid<f) c[last][]=now;
else c[last][]=now;
}
int find(int k,int rank)//以k为根的树中找rank
{
int l=c[k][],r=c[k][];
if (size[l]+==rank) return k;
else if (size[l]>=rank) return find(l,rank);
else return find(r,rank-size[l]-);
}
void del(int k)
{
int x,y,z;
x=find(rt,k-),y=find(rt,k+);
splay(x,rt),splay(y,c[x][]);
z=c[y][],c[y][]=,fa[z]=size[z]=;//把前驱转到根,把后驱转到根右子树,然后根右子树左儿子就是要删除的值。
update(y),update(x);
}
void move(int k,int val)//就是将编号为k的放到val值的地方。
{
int x,y,z=pos[k],rank;
splay(z,rt);
rank=size[c[z][]]+;
del(rank);
if (val==inf) x=find(rt,n),y=find(rt,n+);
else if (val==-inf) x=find(rt,),y=find(rt,);
else x=find(rt,rank+val-),y=find(rt,rank+val);
splay(x,rt),splay(y,c[x][]);
size[z]=,fa[z]=y,c[y][]=z;
update(y),update(x);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n+;i++)//特别把1空出来,防止越界。
{
scanf("%d",&a[i]);
pos[a[i]]=i;//反向映射。
}
build(,n+,);
rt=(+n)>>;
char ch[];int S,T;
for (int i=;i<=m;i++)
{
scanf("%s%d",ch,&S);
switch(ch[])
{
case'T':move(S,-inf);break;
case'B':move(S,inf);break;
case'I':scanf("%d",&T);move(S,T);break;
case'A':splay(pos[S],rt);printf("%d\n",size[c[pos[S]][]]-);break;
case'Q':printf("%d\n",v[find(rt,S+)]);break;
}
}
}
bzoj1861 [Zjoi2006]Book 书架 splay的更多相关文章
- bzoj1861 [Zjoi2006]Book 书架——splay
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1861 发现自己想splay的时候总是纠结那个点权是什么,因为splay原本是二分查找树... ...
- [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在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ...
随机推荐
- [Ljava.lang.String; cannot be cast to java.lang.String报错的原因
完整错误信息: java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String 报这个错的原因 ...
- JAVA / MySql 编程—— 第三章 高级查询(一)
1. 修改表: (1)修改表名语法: ALTER TABLE <旧表名> RENAME [ TO ] <新表名>: 注意:其中[TO]为可选参数,使用与否不影响结 ...
- Python学习笔记:PEP8常用编程规范
PEP8编码规范是一种非常优秀的编码规范,也得到了Python程序员的普遍认可,如果实践中或者项目中没有统一的编码规范,建议尽量遵循PEP8编码规范,当然如果项目中已经有了自身的编码规范,应当优先遵循 ...
- python_字符串_常用处理
1. 输出原序列的反向互补序列 in1 = open("brca1.fasta", "r") out1 = open("re_brca1.fasta& ...
- 722. Remove Comments
class Solution { public: vector<string> removeComments(vector<string>& source) { vec ...
- UCLOUD使用云主机
购买云主机后,购买弹性ip: 设置外网防火墙,浏览器否则无法访问服务器资源: 在云主机绑定自定义的防火墙: 使用ssh登录服务器: 一般centos自带apache,没有的话安装,具体教程百度: 安装 ...
- wordCount的执行流程
我们对于wordCount的这个流程,在清晰不过了,不过我们在使用spark以及hadoop本身的mapReduce的时候,我们是否理解其中的原理呢,今天我们就来介绍一下wordCount的执行原理, ...
- Git Cheatshell - Pro Git
A git cheatshell based on the book: http://www.git-scm.com/book/en/v2. Repository Configuration git ...
- [Jenkins]持续集成环境下fingbug插件的安装使用与配置
参考:https://wiki.jenkins.io/display/JENKINS/FindBugs+Plugin 突然,天降杂事.我是想安安静静的做个美丽的测试...但是事与愿违,项目经理叫我帮忙 ...
- USACO Section1.1 Friday the Thirteenth 解题报告
friday解题报告 —— icedream61 博客园(转载请注明出处) -------------------------------------------------------------- ...