题面:P2596 [ZJOI2006]书架

题解:记录每本书对应的节点编号

普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中),

查询时从该节点开始逐步往上跳,记录答案。

其他操作都依附在该排名上。

代码:

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
using namespace std;
inline int rd(){
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return f*x;
}
const int maxn=(8e4)+;
int N,M,lc[maxn],rc[maxn],val[maxn],pr[maxn],tot=,siz[maxn];
int u,rt=,s,t,x,y,z,id[maxn],fa[maxn],k;
//id[i]表示编号为i的书所在的节点编号
char o[];
inline int New_node(int x){
val[++tot]=x;
siz[tot]=;
pr[tot]=rand();
return tot;
}
inline void Pushup(int x){
siz[x]=siz[lc[x]]+siz[rc[x]]+;
fa[lc[x]]=fa[rc[x]]=x;
return;
}
inline void Split(int now,int k,int &x,int &y){
if(!now){
x=y=fa[x]=fa[y]=;
return;
}
if(siz[lc[now]]+<=k){
x=now;
Split(rc[now],k-siz[lc[now]]-,rc[now],y);
}
else {
y=now;
Split(lc[now],k,x,lc[now]);
}
Pushup(now);
return;
}
inline int Merge(int x,int y){
if(!x||!y){
fa[x]=fa[y]=x+y;
return x+y;
}
if(pr[x]<pr[y]){
rc[x]=Merge(rc[x],y);
Pushup(x);
return x;
}
else{
lc[y]=Merge(x,lc[y]);
Pushup(y);
return y;
}
}
inline int Find(int x){//寻找x节点上有多少书
int sum=;
sum+=siz[lc[x]];
while(x!=rt){
if(rc[fa[x]]==x)sum+=siz[lc[fa[x]]]+;
x=fa[x];
}
return sum;
}
inline int Query(int k){
int now=rt;
while(now){
if(k<=siz[lc[now]])now=lc[now];
else if(k==siz[lc[now]]+)return now;
else k-=siz[lc[now]]+,now=rc[now];
}
return ;
}
int main(){
srand();
N=rd();M=rd();
for(int i=;i<=N;i++){
u=rd();
rt=Merge(rt,id[u]=New_node(u));
}
while(M--){
scanf("%s",o); s=rd();
if(o[]=='T'){
k=Find(id[s]);
Split(rt,k+,x,z);
Split(x,k,x,y);
rt=Merge(Merge(x,Merge(lc[y],rc[y])),z);
rt=Merge(id[s],rt);
}
else if(o[]=='B'){
k=Find(id[s]);
Split(rt,k+,x,z);
Split(x,k,x,y);
rt=Merge(Merge(x,Merge(lc[y],rc[y])),z);
rt=Merge(rt,id[s]);
}
else if(o[]=='I'){
t=rd();
k=Find(id[s]);
Split(rt,k+,x,z);
Split(x,k,x,y);
rt=Merge(Merge(x,Merge(lc[y],rc[y])),z);
Split(rt,k+t,x,y);
rt=Merge(Merge(x,id[s]),y);
}
else if(o[]=='A'){
printf("%d\n",Find(id[s]));
}
else {//Q
printf("%d\n",val[Query(s)]);
}
}
return ;
}

By:AlenaNuna

fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架的更多相关文章

  1. luogu P2596 [ZJOI2006]书架

    传送门 感觉要死在\(Splay\)里了 orz 这题用\(Splay\)维护这个序列,其中的第\(k\)大点代表这个序列的第\(k\)个数 第一个操作,先把那个数所在的点旋到根,然后把整个根的左子树 ...

  2. [Luogu 2596] ZJOI2006 书架

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

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

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

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

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

  5. P2596 [ZJOI2006]书架(splay)

    [题目链接] https://www.luogu.org/problemnew/show/P2596 平衡树,需支持五个操作: 1. 将某元素置顶:将元素旋到根,然后将左子树合并到该元素的后继 2. ...

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

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

  7. P2596 [ZJOI2006]书架

    思路 一开始写fhq-treap 感觉越写越感觉splay好些,就去splay 然后维护序列 注意前驱后继的不存在的情况 但不用插入虚拟节点(那插入岂不太麻烦) 跑的真慢的一批,splay太多了 错误 ...

  8. 洛谷 P2596 [ZJOI2006]书架 (splay)

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

  9. [luogu] P1772 [ZJOI2006]物流运输(动态规划,最短路)

    P1772 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线 ...

随机推荐

  1. 树链剖分&咕咕咕了好久好久的qtree3

    前言 显然qtree系列都是树链剖分辣 发现自己没有专门整理过树链剖分耶 辣么就把这篇博客魔改成树链剖分好辣(貌似除了树剖也没什么好写的) 正文 废话了辣么多终于开始了 一.树剖怎么写鸭 二.树剖有什 ...

  2. VASP计算参考

    1.VASP 结构优化.静态自洽.非自洽计算:https://blog.csdn.net/kyang_823/article/details/59110848 2.VASP贋势:https://blo ...

  3. (转)深入理解Java:注解(Annotation)自定义注解入门

    向作者致敬! 转自:http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在 ...

  4. 你知道 Git 是如何做版本控制的吗?(转)

    总结:阅读这篇文章需要20分钟 本文是转载自 滴滴WebApp架构组 的一篇文章,文章讲解了神秘的.git目录下的一些文件,最终阐述了git是如何存储数据,及git分支的相关内容. git如何存储数据 ...

  5. 基于python+requests的简单接口测试

    在进行接口测试时,我们可以使用已有的工具(如:jmeter)进行,也可以使用python+requests进行.以下为简单的接口测试模板: 一.提取常用变量,统一配置 新建一个config.py文件, ...

  6. C# 实现IDisposable

    #region 实现IDisposable public void Dispose() { Dispose(true); GC.SuppressFinalize(this);//防止Finalize调 ...

  7. oracle ogg--ogg搭建过程中遇到的错误及处理

    1 PRVF-0002 : Could not retrieve local nodename---# Begin Stacktrace #---------------------------ID: ...

  8. xshell 缺少mfc110u.dll

    https://www.microsoft.com/zh-CN/download/details.aspx?id=30679 如果 x64 没有反应,就下载 x86 安装试试,

  9. 【ABAP系列】SAP ABAP 行列转换的方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 行列转换的方法 ...

  10. 应用安全 - 工具 - NScan - 漏洞汇总

    工具介绍 Date 用途 端口服务扫描 | whois | nslookup Nscan v0.9.1 缓冲区溢出导致远程代码执行 Date 类型缓冲区溢出导致远程代码执行 影响范围 复现字符量过多 ...