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 ...
随机推荐
- bzoj 4513 [Sdoi2016]储能表
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4513 题解 要求的式子 用数位dp的方法去做 我们把式子拆开 变成 $\sum_{i=0}^ ...
- (023) 关于51单片机的A5指令
可看见一篇讲51单片机加密的文章这么讲: [加密方法:在A5后加一个二字节或三字节操作码,因为所有反汇编软件都不会反汇编A5指令,造成正常程序反汇编乱套,执行程序无问题仿制者就不能改变你的源程序.] ...
- C#基础学习2
变量与数据类型!
- WPF学习12:基于MVVM Light 制作图形编辑工具(3)
本文是WPF学习11:基于MVVM Light 制作图形编辑工具(2)的后续 这一次的目标是完成 两个任务. 本节完成后的效果: 本文分为三个部分: 1.对之前代码不合理的地方重新设计. 2.图形可选 ...
- apt-get的一些坑
apt-get update:更新安装列表apt-get upgrade:升级软件apt-get install software_name :安装软件apt-get --purge remove ...
- [ SNOI 2013 ] Quare
Description 题目链接 求一张无向带权图的边双连通生成子图的最小代价. Solution 核心的思路是,一个点双连通分量肯定是一堆环的并. 考虑增量地构造这个边双连通图,每次把一个环并进去, ...
- Java报表之JFreeChart
一.JFreeChart简介 JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications,servlets以及JSP等使用所设计. JFre ...
- 自定义Toast的显示位置和显示内容
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- Knockout-了解Observable与computed
KO是什么? KO不是万能的,它的出现主要是为了方便的解决下面的问题: UI元素较多,用户交互比较频繁,需要编写大量的手工代码维护UI元素的状态.样式等属性? UI元素之间关系比较紧密,比如操作一个元 ...
- Oracle的Central Inventory和Local inventory详解
很多朋友对Oracle的inventory信息不太了解以至遇到相关的问题不知道如何处理,这篇文章我们将详细讲解Oracle的Central Inventory (oraInventory)和Local ...