题面: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. rtmpdump禁用openssl

    rtmpdump禁用openssl 主要是编译方便 很多地方根本不需要用openssl 先找到librtmp/rtmp_sys.h 然后加入宏#define NO_CRYPTO在#ifdef _WIN ...

  2. 嵌入式Linux之NFS配置

    NFS(Network File System) 1.RPC和rpcbind RPC(Remote Procedure Call)即远程过程调用,是分布式应用的基础,即允许计算机远程调用网络上其他计算 ...

  3. oracle之VARCHAR2(50 CHAR) 和VARCHAR2(50) 区别?

      首先要明白的是:根据字符集不同,varchar2(50)这样在gbk可存25个汉字,utf8可存16个汉字 这里的50相当于50BYTE,是按字节计数,50CHAR是按字符计数. 对于多字节字符( ...

  4. 2、Shiro的认证

    Shiro的认证流程大体可以参考下面这幅图: 但是没有接触过shiro的同学看到上面的图片也不明白,下面我们来在代码中尝试体验Shiro的认证过程: 1.新建一个SpringBoot项目项目结构如下: ...

  5. PyQt5学习一---环境的安装和配置

    PyQt5环境安装 1.Python环境(我在练习的时候是用的Python3.6.8) 2.PyQt5安装 首先安装sip pip install sip 然后安装PyQt5-tools pip in ...

  6. 中国MOOC_零基础学Java语言_第7周 函数_2完数

    2 完数(5分) 题目内容: 一个正整数的因子是所有可以整除它的正整数.而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数.例如6=1+2+3(6的因子是1,2,3). 现在,你要写一个程序, ...

  7. Oracle不完全恢复-主动恢复和incarnation/RMAN-20208/RMAN-06004

    12.3 主动恢复 主动不完全恢复是将数据库“撤回”到从前的传统方法,主要用来撤销认为修改.一般需要先判断PIT点的时间或SCN --1 重启db到mount状态 --2 用restore将所有的数据 ...

  8. spring -boot定时任务 quartz 基于 JobDetailFactoryBean实现

    这个有点小问题 尚未解决  后期优化 基于 JobDetailFactoryBean实现 依赖包 <dependencies> <dependency> <groupId ...

  9. 基于opencv简单的图片截取

    import xml.etree.ElementTree as ET import os, cv2 from tqdm import tqdm annota_dir = 'C:\\Users\\Adm ...

  10. [转帖]APT34攻击全本分析

    APT34攻击全本分析 https://zhuanlan.kanxue.com/article-8401.htm 高手太多 我等菜鸟目不暇接.. 一.事件综述 2019年4月18日,黑客/黑客组织使用 ...