ZJOI2006书架
追yql做题记录的时候做到的……一道Splay模版题……
啊LCT写久了都有点忘了Splay了(什么奇怪的逻辑?)
其实说白了五个操作:
1、 将某元素置顶:将元素旋到根,然后将左子树合并到该元素的后继
2、 将某元素置底:将元素旋到根,然后将右子树合并到该元素的前驱
3、 将某元素提前/滞后1位:直接与该元素的前驱/后继交换位置及信息
4、 询问指定元素排名:将元素旋到根,输出size-1
5、 询问指定排名元素:在树上find
不好,我……我发现……我还在写数据结构!
#include<bits/stdc++.h>
#define N 80005
#define inf 1000000007
using namespace std;
int n,m,a[N],sz,pos[N];
struct Splay_Tree{
int c[N][],fa[N],dep[N],size[N],val[N],rt;
inline void pushup(int x){size[x]=size[c[x][]]+size[c[x][]]+;}
inline 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;
pushup(y);pushup(x);
}
inline void splay(int x,int &k){
while(k!=x){
int y=fa[x],z=fa[y];
if(y!=k){
if((c[z][]==y)^(c[y][]==x))rotate(x,k);
else rotate(y,k);
}rotate(x,k);
}
}
void build(int l,int r,int f){
if(l>r)return;
int now=l,last=f;
if(l==r){
val[l]=a[l];size[l]=;fa[l]=f;
if(l<f)c[f][]=l;else c[f][]=l;
}
int mid=(l+r)>>;
build(l,mid-,mid);build(mid+,r,mid);
val[mid]=a[mid];fa[mid]=f;pushup(mid);
if(mid<f)c[f][]=mid;else c[f][]=mid;
}
int find(int k,int x){
int l=c[k][],r=c[k][];
if(size[l]+==x)return k;
else if(size[l]>=x)return find(l,x);
else return find(r,x-size[l]-);
}
void del(int k){
int x=find(rt,k-),y=find(rt,k+),z;
splay(x,rt);splay(y,c[x][]);
z=c[y][];c[y][]=;fa[z]=size[z]=;
pushup(y);pushup(x);
}
void move(int k,int v){
int x,y,z=pos[k],rk;
splay(z,rt);rk=size[c[z][]]+;
del(rk);
if(v==inf)x=find(rt,n),y=find(rt,n+);
else if(v==-inf)x=find(rt,),y=find(rt,);
else x=find(rt,rk+v-),y=find(rt,rk+v);
splay(x,rt);splay(y,c[x][]);
size[z]=;fa[z]=y;c[y][]=z;
pushup(y);pushup(x);
}
}Splay;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();m=read();
for(int i=;i<=n+;i++)a[i]=read(),pos[a[i]]=i;
Splay.build(,n+,);Splay.rt=(n+)>>;
char s[];int x,y;
while(m--){
scanf("%s",s);x=read();
switch(s[]){
case 'T':Splay.move(x,-inf);break;
case 'B':Splay.move(x,inf);break;
case 'I':y=read();Splay.move(x,y);break;
case 'A':Splay.splay(pos[x],Splay.rt);printf("%d\n",Splay.size[Splay.c[pos[x]][]]-);break;
case 'Q':printf("%d\n",Splay.val[Splay.find(Splay.rt,x+)]);break;
}
}
return ;
}
ZJOI2006书架的更多相关文章
- 「luogu2569」[ZJOI2006] 书架
「luogu2569」[ZJOI2006]书架 题目大意 给定一个长度为 \(n\) 序列,序列中第 \(i\) 个元素有编号 \(a_i(a_i \in \Z \cap [1,n])\),需要支持五 ...
- 洛谷 P2596 [ZJOI2006]书架 解题报告
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
- P2596 [ZJOI2006]书架 && Splay 区间操作(三)
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
- [Luogu 2596] ZJOI2006 书架
[Luogu 2596] ZJOI2006 书架 第一次指针写 FHQ_Treap(省选噩梦数据结构)AC 啦! 省选试机写它,紧张过度失败了. 省选 Day 1 考场写它,写挂了. 省选 Day 1 ...
- fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架
题面:P2596 [ZJOI2006]书架 题解:记录每本书对应的节点编号 普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中) ...
- [ZJOI2006]书架(权值splay)
[ZJOI2006]书架(luogu) Description 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看 ...
- wikioi 1514 and ZJOI2006 书架
1514 书架 0人推荐 收藏 发题解 提交代码 报错 题目描述 输入描述 输出描述 样例输入 样例输出 提示 题目描述 Description 小 T有一个很大的书柜.这个书柜的构造有些独特,即书柜 ...
- [洛谷P2596] [ZJOI2006]书架
洛谷题目链接:书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后 ...
- BZOJ1861:[ZJOI2006]书架
浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...
- luogu2596 [ZJOI2006]书架
treap.树是以"优先级"(优先级越小,在书架上越靠上)形成的,堆是以rand()的权值形成的.还要再维护一个原编号. 置顶/置底:找到那个元素,把它拉出来修改优先级再塞回去. ...
随机推荐
- 分享 go语言爬虫---开源项目Pholcus
写在开头的话:记录一下最近学习Pholcus(https://github.com/henrylee2cn/pholcus)的过程,首先去学习的go基本语法,在没接触的时候发现很多不理解的地方,但是当 ...
- Leetcode 678.有效的括号字符串
有效的括号字符串 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串.有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 ). 任何右括号 ) 必须 ...
- Leetcode 675.为高尔夫比赛砍树
为高尔夫比赛砍树 你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比1大的数 表示一颗允许走过的树的高 ...
- 阿里云服务器安装https证书 centos + httpd + Symantec
一. 环境 centos7 阿里云服务器, httpd服务, 阿里云免费的Symantec证书 阿里云Symantec 有个免费版的证书, 具体怎么申请可以去百度解决 二. 网上大部分的经验贴都是要A ...
- [Mac]Mac OS X中WireShark的使用,及找不到网卡问题的解决方法
1.WireShark依赖X11: 2.默认情况下Mac OS X是不安装X11的: 因此,在Mac上安装WireShark,首先找出Mac OS 安装DVD安装X11. 安装完以后 echo $DI ...
- 使用IMAGEMAGICK的CONVERT工具批量转换图片格式
使用IMAGEMAGICK的CONVERT工具批量转换图片格式 http://www.qiansw.com/linux-imagemagick-convert-img.html Home > 文 ...
- REST接口设计规范
URI格式规范 URI(Uniform Resource Identifiers) 统一资源标示符 URL(Uniform Resource Locator) 统一资源定位符 URI的格式定义如下: ...
- 子组件通过$emit触发父组件的事件时,参数的传递
子组件.vue <template> <div> <el-table :data="comSchemaData" highlight-current- ...
- 在Linux下调试Python代码的各种方法
这是一个我用于调试或分析工具概述,不一定是完整全面,如果你知道更好的工具,请在评论处标记. 日志 是的,的确,不得不强调足够的日志记录对应用程序是多么的重要.您应该记录重要的东西,如果你的记录足够好的 ...
- ai学习记录
界面:多个预编辑区:制作图形,使用的图形放到工作区内,不使用在预编区.没有Ctrl/Alt+delete的概念,没有前后景颜色.新建:分辨率:矢量软件和分辨率无关: 新建时候不要勾选对齐到像素网格 存 ...