luogu2596 [ZJOI2006]书架
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]书架的更多相关文章
- 「luogu2569」[ZJOI2006] 书架
「luogu2569」[ZJOI2006]书架 题目大意 给定一个长度为 \(n\) 序列,序列中第 \(i\) 个元素有编号 \(a_i(a_i \in \Z \cap [1,n])\),需要支持五 ...
- 洛谷 P2596 [ZJOI2006]书架 解题报告
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
- P2596 [ZJOI2006]书架 && Splay 区间操作(三)
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
- [Luogu 2596] ZJOI2006 书架
[Luogu 2596] ZJOI2006 书架 第一次指针写 FHQ_Treap(省选噩梦数据结构)AC 啦! 省选试机写它,紧张过度失败了. 省选 Day 1 考场写它,写挂了. 省选 Day 1 ...
- fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架
题面:P2596 [ZJOI2006]书架 题解:记录每本书对应的节点编号 普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中) ...
- [ZJOI2006]书架(权值splay)
[ZJOI2006]书架(luogu) Description 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看 ...
- wikioi 1514 and ZJOI2006 书架
1514 书架 0人推荐 收藏 发题解 提交代码 报错 题目描述 输入描述 输出描述 样例输入 样例输出 提示 题目描述 Description 小 T有一个很大的书柜.这个书柜的构造有些独特,即书柜 ...
- [洛谷P2596] [ZJOI2006]书架
洛谷题目链接:书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后 ...
- BZOJ1861:[ZJOI2006]书架
浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...
随机推荐
- scikit-learning教程(二)统计学习科学数据处理的教程
统计学习:scikit学习中的设置和估计对象 数据集 Scikit学习处理来自以2D数组表示的一个或多个数据集的学习信息.它们可以被理解为多维观察的列表.我们说这些阵列的第一个轴是样本轴,而第二个轴是 ...
- 贪心 Codeforces Round #297 (Div. 2) C. Ilya and Sticks
题目传送门 /* 题意:给n个棍子,组成的矩形面积和最大,每根棍子可以-1 贪心:排序后,相邻的进行比较,若可以读入x[p++],然后两两相乘相加就可以了 */ #include <cstdio ...
- 题解报告:zoj 3261 Connections in Galaxy War(离线并查集)
Description In order to strengthen the defense ability, many stars in galaxy allied together and bui ...
- 组件的 render 方法
React.js 中一切皆组件,用 React.js 写的其实就是 React.js 组件.我们在编写 React.js 组件的时候,一般都需要继承 React.js 的 Component(还有别的 ...
- AJPFX总结java开发常用类(包装,数字处理集合等)(一)
一:首谈java中的包装类 Java为基本类型提供包装类,这使得任何接受对象的操作也可以用来操作基本类型,直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类.jav ...
- BBS项目总结
数据库(Oracle): BBSUserid:主键username:用户名password:密码pic:头像 blobpagenum:每个人分页喜好数量,每页显示多少行 Article :ID:主键, ...
- logging模块进阶2
1.两种级别设置: 全局级别:生成logger对象后设置的级别 局部级别:生成handler对象设置的级别 我们都知道输出的级别不能低于设定的级别,那么全局级别和局部级别哪一个对输出产生影响? 经过多 ...
- (4)《Head First HTML与CSS》学习笔记---文本的CSS规则和盒模型;div与span;<a>元素的链接色;伪类
1.每个font-family包含一组共同特征的字体.共五个字体系列: sans-serif----这个系列包括了没有衬线的字体,与serif相比,通常认为这个系列更容易在计算机上识读. serif- ...
- PMP项目管理学习笔记(3)——过程框架
所有项目,不论大小,都可以分解为过程组: 如果项目规模很大,可以分阶段管理,每个阶段都要经过上面的五个过程组,从启动到收尾. 阶段的类型: 顺序阶段: 一个阶段完成后进入下个阶段. 重叠阶段: 有时需 ...
- JS正则匹配待重命名文件名
<script>var str = "123 - Copy(2).csv";var regExp = /^123( - Copy(\(\d+\))?)?.csv$/;d ...