题面: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. (转)js中then方法说明

    javascript中的then方法说明: then()方法是异步执行.  意思是:就是当.then()前的方法执行完后再执行then()内部的程序,这样就避免了,数据没获取到等的问题.  语法:pr ...

  2. 第五周总结&实验报告三

    第五周总结&实验报告三 实验报告 1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码.结果截图.) ① 统计该字符串中字母s ...

  3. Eigen中的矩阵及向量运算

    Eigen中的矩阵及向量运算 ,[+,+=,-,-=] ,[\*,\*=] ,[.transpose()] ,[.dot(),.cross(),.adjoint()] ,针对矩阵元素进行的操作[.su ...

  4. maven之pom.xml的配置

    pom.xml是配置文件: <dependencies>表示依赖,里面可以有多个<dependency> 比如当前使用了junit的jar包,版本是3,8,1,我们现在更换新的 ...

  5. 在GAE中用Python编写webapp进行Post数据采集

    #!/usr/bin/env python # -*- coding: cp936 -*- # # Copyright 2007 Google Inc. # # Licensed under the ...

  6. linux/linux学习笔记-常用命令(mooc)

    一.命令基本格式及文件处理命令 1.linux命令格式 简化选项用-表示,完整选项用--表示 注:linux通过权限位第1位(-:文件 / d:目录 / l:链接文件 来区分文件类型) 2.linux ...

  7. SOAP详解(转)

    1. SOAP简介 1.1应用背景 对于应用程序开发来说,使程序之间进行因特网通信是很重要的.目前的应用程序通过使用远程过程调用(RPC)在诸如 DCOM 与 CORBA 等对象之间进行通信,但是 H ...

  8. ubuntu server安装的一些坑

    [没有root用户] ubuntu server安装的时候要你新建一个用户,安装完成后,你需要手动开启root. $ sudo passwd root 输入你当前用户的密码 输入你希望的root用户的 ...

  9. window环境rabbitMQ安装和php扩展安装

    下面的安装步骤,已经在2018-11-27试验通过. 1.安装前的准备 phpinfo查看php的版本.系统是多少位的,php版本是否是线程安全,php.ini文件的路径 2.安装rabbitMQ 安 ...

  10. disabled_button 按钮按不下去

    X老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去 检查元素 删除 按钮就可以摁了 出现答案