链接:https://www.luogu.org/problemnew/show/P2596

题解:

写了两天的平衡树终于大概弄好了所有模板(模板不熟写错debug真是要死)

对于放在头尾,只需要删除,再在头/尾插入就可以了

对于交换,就交换一下映射

代码:

#include <bits/stdc++.h>
#define maxn 100000
using namespace std;
int n,m,data[maxn],count2[maxn],leftson[maxn],rightson[maxn],fa[maxn],a[maxn],
point[maxn],num,root;
void updata(int x)
{
count2[x]=count2[leftson[x]]+count2[rightson[x]]+;
}
void rotate(int x,int y)
{
int father=fa[x];
if (y==)
{
rightson[father]=leftson[x];
if (leftson[x]) fa[leftson[x]]=father;
} else
{
leftson[father]=rightson[x];
if (rightson[x]) fa[rightson[x]]=father;
}
fa[x]=fa[father];
if (fa[father])
{
if (leftson[fa[father]]==father)
leftson[fa[father]]=x;
else rightson[fa[father]]=x;
}
fa[father]=x;
if (y==) leftson[x]=father; else rightson[x]=father;
updata(father); updata(x);
}
void splay(int x,int goal)
{
if (x==root) return;
int father=fa[x];
while (father!=goal)
{
if (fa[father]==goal)
{
if (x==leftson[father]) rotate(x,); else rotate(x,);
} else
{
if (father==leftson[fa[father]])
{
if (x==leftson[father]) rotate(father,),rotate(x,);
else rotate(x,),rotate(x,);
} else
{
if (x==rightson[father]) rotate(father,),rotate(x,);
else rotate(x,),rotate(x,);
}
}
father=fa[x];
}
if (goal==) root=x;
}
#define mid (h+t)/2
void build(int h,int t,int father,bool x,int a[maxn])
{
count2[++num]=; data[num]=a[mid]; fa[num]=father;
point[a[mid]]=num;
if (father)
{
if (x==) leftson[father]=num; else rightson[father]=num;
}
int tmp=num;
if (h<mid) build(h,mid-,tmp,,a);
if (mid<t) build(mid+,t,tmp,,a);
updata(tmp);
}
int search(int goal)
{
int x=root,cnt=;
while (x)
{
if (cnt+count2[leftson[x]]==goal) return(x);
if (count2[leftson[x]]+cnt<goal)
{
cnt+=count2[leftson[x]]+; x=rightson[x];
} else
{
x=leftson[x];
}
}
}
void delete1()
{
int x=leftson[root];
if (x==)
{
root=rightson[root]; fa[root]=; return;
}
while (rightson[x]) x=rightson[x];
splay(x,root);
rightson[x]=rightson[root];
if (rightson[root]) fa[rightson[root]]=x;
updata(x);
root=x; fa[x]=;
}
void insert1(int x)
{
int y=root;
while (leftson[y]) count2[y]++,y=leftson[y]; count2[y]++;
leftson[y]=x; fa[x]=y; leftson[x]=; rightson[x]=; count2[x]=;
}
void insert2(int x)
{
int y=root;
while (rightson[y]) count2[y]++,y=rightson[y]; count2[y]++;
rightson[y]=x; fa[x]=y; rightson[x]=; leftson[x]=; count2[x]=;
}
void print(int x)
{
if (leftson[x]) print(leftson[x]);
cout<<data[x]<<" ";
if (rightson[x]) print(rightson[x]);
}
char c[];
int main()
{
freopen("noip.in","r",stdin);
freopen("noip.out","w",stdout);
cin>>n>>m;
for (int i=;i<=n;i++)
{
cin>>a[i];
}
build(,n,,,a); root=;
for (int i=;i<=m;i++)
{
// print(root); cout<<i-1<<endl;
cin>>c; int d,e;
if (c[]=='T')
{
cin>>d; int x=point[d]; splay(x,);
delete1(); insert1(x);
}
if (c[]=='B')
{
cin>>d; int x=point[d]; splay(x,);
delete1();
insert2(x);
}
if (c[]=='I')
{
cin>>d>>e;
if (e!=)
{
int x1=point[d]; splay(x1,);
int x2=search(count2[leftson[x1]]++e);
swap(point[d],point[data[x2]]);
swap(data[x2],data[x1]);
}
}
if (c[]=='A')
{
cin>>d; int x=point[d];
splay(x,);
cout<<count2[leftson[x]]<<endl;
}
if (c[]=='Q')
{
cin>>d; int x=search(d);
cout<<data[x]<<endl;
}
}
}

[ZJOI2006]书架的更多相关文章

  1. 「luogu2569」[ZJOI2006] 书架

    「luogu2569」[ZJOI2006]书架 题目大意 给定一个长度为 \(n\) 序列,序列中第 \(i\) 个元素有编号 \(a_i(a_i \in \Z \cap [1,n])\),需要支持五 ...

  2. 洛谷 P2596 [ZJOI2006]书架 解题报告

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

  3. P2596 [ZJOI2006]书架 && Splay 区间操作(三)

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

  4. [Luogu 2596] ZJOI2006 书架

    [Luogu 2596] ZJOI2006 书架 第一次指针写 FHQ_Treap(省选噩梦数据结构)AC 啦! 省选试机写它,紧张过度失败了. 省选 Day 1 考场写它,写挂了. 省选 Day 1 ...

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

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

  6. [ZJOI2006]书架(权值splay)

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

  7. wikioi 1514 and ZJOI2006 书架

    1514 书架 0人推荐 收藏 发题解 提交代码 报错 题目描述 输入描述 输出描述 样例输入 样例输出 提示 题目描述 Description 小 T有一个很大的书柜.这个书柜的构造有些独特,即书柜 ...

  8. [洛谷P2596] [ZJOI2006]书架

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

  9. BZOJ1861:[ZJOI2006]书架

    浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...

  10. luogu2596 [ZJOI2006]书架

    treap.树是以"优先级"(优先级越小,在书架上越靠上)形成的,堆是以rand()的权值形成的.还要再维护一个原编号. 置顶/置底:找到那个元素,把它拉出来修改优先级再塞回去. ...

随机推荐

  1. 流媒体技术学习笔记之(一)nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器

    参照网址: [1]http://blog.csdn.net/redstarofsleep/article/details/45092147 [2]HLS介绍:http://www.cnblogs.co ...

  2. 02-MySQL的安装和配置

    1. 软件和环境 注:安装MySQL数据库的操作系统必须保证有.NET环境和VC运行库的支持.    下载地址:百度云网盘链接 2. MySQL服务器安装详细步骤 (1). 选择安装类型 这里我们选择 ...

  3. Python异常处理和进程线程-day09

    写在前面 上课第九天,打卡: 最坏的结果,不过是大器晚成: 一.异常处理 - 1.语法错误导致的异常 - 这种错误,根本过不了python解释器的语法检测,必须在程序运行前就修正: - 2.逻辑上的异 ...

  4. linux系统中查看己设置iptables规则

    1.iptables -L 查看filter表的iptables规则,包括所有的链.filter表包含INPUT.OUTPUT.FORWARD三个规则链. 说明:-L是--list的简写,作用是列出规 ...

  5. Jquery 获取radio选中值

  6. linux 网络之 bond 网卡模式

    Linux bond模式通过多个网卡绑定技术既能增加服务器的可靠性,又增加了可用网络宽带,为用户提供不间断的网络服务: 七种bond模式: 第一种模式:mod=0 ,即:(balance-rr) Ro ...

  7. pyqt5-布局控件

    在布局中添加控件用addWidght(),添加布局用addLayout() 垂直布局QVBoxLayout 需要导入  from PyQt5.QtWidgets import QVBoxLayout ...

  8. Linux之常用命令【service】

    补充说明 service命令 是Redhat Linux兼容的发行版中用来控制系统服务的实用工具,它以启动.停止.重新启动和关闭系统服务,还可以显示所有系统服务的当前状态. 语法 service(选项 ...

  9. Oracle sqlplus失去响应解决方法/如何在数据库失去响应时转储状态信息(转)

    某云平台出现故障,sqlplus连接Oracle数据库,发现没有响应.数据库版本:12.1.0.2.0 查找.借鉴前人经验,成功处理此问题,参考网址:如何在数据库失去响应时转储状态信息 - Oracl ...

  10. Python巧用正则表达式,完成接口参数替换

    最近给Python11期的小朋友们上课,遇到了一个参数替换的问题,首先描述下场景: 需要参数化的数据如下所示: 这个时候如果利用单纯的if判断和字符串的find和replace方法,做起来是非常不明智 ...