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 ...
随机推荐
- docker监控之cadvisor
docker run -d \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:rw \ --volume=/sys:/sys:ro \ --vo ...
- mysql 如何创建一个简单的存储过程
1 用mysql客户端登入2 选择数据库 mysql>use test3 查询当前数据库有哪些存储过程 mysql>show procedure status where Db='test ...
- django 相关问题
和数据库的连接 session的实现 django app开发步骤 python环境准备 数据库安装 model定义 url mapping定义 view定义 template定义 如何查看数据库里的 ...
- 接口测试01 - HTTP协议报文结构及示例
HTTP基本架构 用一张简单的流程图来展示HTTP协议的基本架构,以便先有个基础的了解. 1)Web Client可以是浏览器.搜索引擎等等一切基于HTTP协议发起http请求的工具. 2)Web S ...
- Hadoop工作流--ChainMapper/ChainReducer?(三)
不多说,直接上干货! Hadoop的ChainMapper和ChainReducer使用案例(链式处理) 什么是ChainMapper/ChainReducer?
- sql注入原理及解决方案
sql注入原理 sql注入原理就是用户输入动态的构造了意外sql语句,造成了意外结果,是攻击者有机可乘 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的 ...
- 由浅入深一个Demo带你认识Restful风格的架构
java作为一门后端语言,其厉害之处在于web,大家比较熟知的各种网络应用,java都能做,那么在这个移动优先的时代,如何继续发挥java的强大之处呢? 通常是让java作为一个app的服务端,为ap ...
- 转 Java 208道面试题及部分答案 补充部分答案
转自https://www.cnblogs.com/chen1005/p/10481102.html ---恢复内容开始--- 一.Java 基础 1.JDK 和 JRE 有什么区别? 答:JRE ...
- 【转】Android中实现IPC的几种方式详细分析及比较
1.使用Bundle ----> 用于android四大组件间的进程间通信android的四大组件都可使用Bundle传递数据 所以如果要实现四大组件间的进程间通信 完全可以使用Bundl ...
- k-window的关闭与打开设置
// 打开弹框窗口 public showKwinDow() { const that = this as any; // 设置窗口居中 that.$refs['setAddEdit'].widget ...