treap。树是以“优先级”(优先级越小,在书架上越靠上)形成的,堆是以rand()的权值形成的。还要再维护一个原编号。

置顶/置底:找到那个元素,把它拉出来修改优先级再塞回去。

insert:即一个元素和他“附近”的元素交换位置,把他们两个拉出来,交换优先级再塞回去

#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int n, m, minn, maxn, a[80005], uu, rot, vv, cnt;
char ss[15];
struct Treap{
int val[200005], rnd[200005], l[200005], r[200005], siz[200005];
int bh[200005];
void upd(int x){
siz[x] = siz[l[x]] + siz[r[x]] + 1;
}
void lRotate(int &k){
int t=r[k]; r[k] = l[t]; l[t] = k;
siz[t] = siz[k]; upd(k); k = t;
}
void rRotate(int &k){
int t=l[k]; l[k] = r[t]; r[t] = k;
siz[t] = siz[k]; upd(k); k = t;
}
void insert(int &k, int b){
if(!k){
k = ++cnt; val[k] = a[b]; bh[k] = b;
rnd[k] = rand(); siz[k] = 1;
return ;
}
siz[k]++;
if(val[k]<a[b]){
insert(r[k], b);
if(rnd[r[k]]<rnd[k]) lRotate(k);
}
else{
insert(l[k], b);
if(rnd[l[k]]<rnd[k]) rRotate(k);
}
}
void shanchu(int &k, int b){
if(!k) return ;
if(val[k]==a[b]){
if(l[k]*r[k]==0) k = l[k] + r[k];
else if(rnd[l[k]]<rnd[r[k]])
rRotate(k), shanchu(k, b);
else
lRotate(k), shanchu(k, b);
}
else if(val[k]>a[b])
siz[k]--, shanchu(l[k], b);
else
siz[k]--, shanchu(r[k], b);
}
int queryRank(int k, int b){
if(!k) return 0;
if(a[b]<val[k]) return queryRank(l[k], b);
else if(a[b]>val[k]) return queryRank(r[k], b)+siz[l[k]]+1;
else return siz[l[k]]+1;
}
int queryNum(int k, int b){
if(!k) return 0;
if(b<=siz[l[k]]) return queryNum(l[k], b);
else if(b>siz[l[k]]+1) return queryNum(r[k], b-siz[l[k]]-1);
else return bh[k];
}
}treap;
int main(){
cin>>n>>m;
minn = 1; maxn = n;
for(int i=1; i<=n; i++){
scanf("%d", &uu);
a[uu] = i;
treap.insert(rot, uu);
}
while(m--){
scanf("%s %d", ss, &uu);
if(ss[0]=='T'){
treap.shanchu(rot, uu);
a[uu] = --minn;
treap.insert(rot, uu);
}
if(ss[0]=='B'){
treap.shanchu(rot, uu);
a[uu] = ++maxn;
treap.insert(rot, uu);
}
if(ss[0]=='I'){
scanf("%d", &vv);
if(vv==0) continue;
int t=treap.queryRank(rot, uu);
int q=treap.queryNum(rot, t+vv);
treap.shanchu(rot, uu);
treap.shanchu(rot, q);
swap(a[uu], a[q]);
treap.insert(rot, uu);
treap.insert(rot, q);
}
if(ss[0]=='A')
printf("%d\n", treap.queryRank(rot, uu)-1);
if(ss[0]=='Q')
printf("%d\n", treap.queryNum(rot, uu));
}
return 0;
}

luogu2596 [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 ...

随机推荐

  1. scikit-learning教程(二)统计学习科学数据处理的教程

    统计学习:scikit学习中的设置和估计对象 数据集 Scikit学习处理来自以2D数组表示的一个或多个数据集的学习信息.它们可以被理解为多维观察的列表.我们说这些阵列的第一个轴是样本轴,而第二个轴是 ...

  2. 贪心 Codeforces Round #297 (Div. 2) C. Ilya and Sticks

    题目传送门 /* 题意:给n个棍子,组成的矩形面积和最大,每根棍子可以-1 贪心:排序后,相邻的进行比较,若可以读入x[p++],然后两两相乘相加就可以了 */ #include <cstdio ...

  3. 题解报告:zoj 3261 Connections in Galaxy War(离线并查集)

    Description In order to strengthen the defense ability, many stars in galaxy allied together and bui ...

  4. 组件的 render 方法

    React.js 中一切皆组件,用 React.js 写的其实就是 React.js 组件.我们在编写 React.js 组件的时候,一般都需要继承 React.js 的 Component(还有别的 ...

  5. AJPFX总结java开发常用类(包装,数字处理集合等)(一)

    一:首谈java中的包装类 Java为基本类型提供包装类,这使得任何接受对象的操作也可以用来操作基本类型,直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类.jav ...

  6. BBS项目总结

    数据库(Oracle): BBSUserid:主键username:用户名password:密码pic:头像 blobpagenum:每个人分页喜好数量,每页显示多少行 Article :ID:主键, ...

  7. logging模块进阶2

    1.两种级别设置: 全局级别:生成logger对象后设置的级别 局部级别:生成handler对象设置的级别 我们都知道输出的级别不能低于设定的级别,那么全局级别和局部级别哪一个对输出产生影响? 经过多 ...

  8. (4)《Head First HTML与CSS》学习笔记---文本的CSS规则和盒模型;div与span;<a>元素的链接色;伪类

    1.每个font-family包含一组共同特征的字体.共五个字体系列: sans-serif----这个系列包括了没有衬线的字体,与serif相比,通常认为这个系列更容易在计算机上识读. serif- ...

  9. PMP项目管理学习笔记(3)——过程框架

    所有项目,不论大小,都可以分解为过程组: 如果项目规模很大,可以分阶段管理,每个阶段都要经过上面的五个过程组,从启动到收尾. 阶段的类型: 顺序阶段: 一个阶段完成后进入下个阶段. 重叠阶段: 有时需 ...

  10. JS正则匹配待重命名文件名

    <script>var str = "123 - Copy(2).csv";var regExp = /^123( - Copy(\(\d+\))?)?.csv$/;d ...