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. AtCoder Grand Contest 015 C - Nuske vs Phantom Thnook

    题目传送门:https://agc015.contest.atcoder.jp/tasks/agc015_c 题目大意: 现有一个\(N×M\)的矩阵\(S\),若\(S_{i,j}=1\),则该处为 ...

  2. 洛谷1083(差分+二分 or 线段树)

    第一种方法:可以二分最大天数订单的答案然后通过差分求一下是否可行. ; int n, m, a[maxn], ans; struct section { int cnt, l, r; }b[maxn] ...

  3. Codeforces Round #261 (Div. 2) E

    Description Pashmak's homework is a problem about graphs. Although he always tries to do his homewor ...

  4. 二分查找 BestCoder Round #36 ($) Gunner

    题目传送门 /* 题意:问值为x的个数有几个,第二次查询就是0 lower/upper_bound ()函数的使用,map也可过,hash方法不会 */ #include <cstdio> ...

  5. CentOS6.5下安装Redis2.8.6和phpredis2.2.4扩展

    一.版本说明 CentOS版本 [plain]view plaincopyprint? [root@localhost ~]# uname Linux [root@localhost ~]# unam ...

  6. SQL系列函数——数学函数

    1.abs函数取数值表达式的绝对值 ) 结果是40 2.ceiling函数取大于等于指定表达式的最小整数 select CEILING(40.5) 结果是41 3.floor函数取小于等于指定表达式的 ...

  7. dubbo系列--重要概念介绍

    dubbo架构图 节点角色说明 整体设计 proxyFactory:就是为了获取一个接口的代理类,例如获取一个远程接口的代理.它有2个方法,代表2个作用 getInvoker:针对server端,将服 ...

  8. iOS 网络开发

    http://www.cnblogs.com/kenshincui/p/4042190.html

  9. git 配置免密上传,配置ssh key

    1.windows 打开git bash 控制台,linux 直接打开命令控制台,输入 ssh-keygen 一直enter 下一步 2.生成的文件windows 存放在c://users 路径下,l ...

  10. Excel数据导入SQL Server

    基本有2种方案,都是无需安装Office的方案 Ole DB读取 + BulkCopy 获取Excel各个SheetName //连接串 string strConn = "Provider ...