题面: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. 冲刺周日 Fighting SunDay

    一.SunDay照片 二.项目分工 三.今日份燃尽图 四.项目进展 码云团队协同环境构建完毕 利用Leangoo制作任务分工及生成燃尽图 完成AES加解密部分代码 用代码实现对文件的新建.移动.复制. ...

  2. Vue/Element-ui 安装搭建开发环境(一)

    Element 是饿了么全段开发团队推出的一套基于 vue.js2.0 的 PC Web 端开发框架. Element 中文文档:https://element.eleme.cn/#/zh-CN 1. ...

  3. http://www.malware-traffic-analysis.net/2018/index.html

    http://www.malware-traffic-analysis.net/2018/index.html

  4. 1. JDK 、 JRE 、JVM有什么区别和联系?

    首先,我们分别对这三者进行阐述. JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的 Java 虚拟机.它只认识 xxx.class 这种类型的文件,它能够将 clas ...

  5. pwa 总结

    概述 前几天了解并按照官方文档,成功实现了一个小型的 pwa demo,现在把总结记录下来,供以后开发时参考,相信对其他人也有用. pwa pwa 包括很多内容,我这里只介绍一部分,因为比如 Push ...

  6. RabbitMQ安装及其中遇到的问题解决方案

    参考官方文档:https://www.rabbitmq.com/install-debian.html#apt 第一步: # import PackageCloud signing key wget ...

  7. mysql explain中的列

    参考:<高性能mysql>附录D EXPLAIN MySql将Select查询分为简单和复杂类型,复杂类型分为3大类:简单子查询,所谓的派生表(在派生表的子查询),以及UNION查询. 列 ...

  8. Java连接Hive使用Zookeeper的方式

    Java连接Hive的方式就是通过JDBC的方式来连接,URL为jdbc:hive2://host:port/db;principal=X@BIGDATA.COM等,这种方式是直接连接HiveServ ...

  9. angulart 常用

    angular: 使用 echarts npm install echarts --save // 安装declare const echarts: any; // 引入https://www.ech ...

  10. SpringBoot项目快速启动停止脚本

    SpringBoot项目快速启动停止脚本 1.在jar包同级目录下,创建 app.sh #!/bin/bash appName=`ls|grep .jar$` if [ -z $appName ] t ...