「luogu2569」[ZJOI2006] 书架
「luogu2569」[ZJOI2006]书架
题目大意
给定一个长度为 \(n\) 序列,序列中第 \(i\) 个元素有编号 \(a_i(a_i \in \Z \cap [1,n])\),需要支持五种操作:
- \(Top\) \(S\) ——表示把编号为 \(S\) 的书放在最上面;
- \(Bottom\) \(S\)——表示把编号为 \(S\) 的书放在最下面;
- \(Insert\) \(S\) \(T\)——\(T \in \{-1,0,1\}\),若编号为 \(S\) 的书上面有 \(X\) 本书,则这条命令表示把这本书放回去后它的上面有 \(X+T\) 本书;
- \(Ask\) \(S\)——询问编号为 \(S\) 的书的上面目前有多少本书;
- \(Query\) \(S\)——询问从上面数起的第 \(S\) 本书的编号。
对于每个 \(Ask\),\(Query\) 操作,输出答案。
(以上摘自luogu)
题解
\(fhq\_treap\) 复健,没有题解。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
inline int in() {
int x=0;char c=getchar();bool f=false;
while(c<'0'||c>'9') f|=c=='-', c=getchar();
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48), c=getchar();
return f?-x:x;
}
const int N = 8e4+5;
int mp[N];
struct fhq_treap {
#define t a[p]
#define lson a[a[p].l]
#define rson a[a[p].r]
struct node {
int l, r, key, size, fa, rnd;
}a[N];
int tot, rt;
inline int new_node(int key) {
a[++tot]=(node){0, 0, key, 1, 0, rand()};
mp[key]=tot;
return tot;
}
inline void push_up(int p) {
if(p) {
t.size=lson.size+rson.size+1;
lson.fa=rson.fa=p;
}
}
void split(int p, int &x, int &y, int k) {
if(!p) return (void)(x=y=0);
if(lson.size<k) x=p, split(t.r, t.r, y, k-lson.size-1);
else y=p, split(t.l, x, t.l, k);
push_up(p);
}
int merge(int x, int y) {
if(!x||!y) return x?x:y;
int p=0;
if(a[x].rnd<a[y].rnd) p=x, t.r=merge(t.r, y);
else p=y, t.l=merge(x, t.l);
push_up(p);
return p;
}
inline int kth_id(int k) {
int p=rt;
while(lson.size+1!=k)
if(lson.size>=k) p=t.l;
else k-=lson.size+1, p=t.r;
return a[p].key;
}
inline int find_rank(int p) {
int ret=lson.size+1;
for(;p!=rt;p=t.fa)
if(a[t.fa].r==p) ret+=a[a[t.fa].l].size+1;
return ret;
}
void debug(int p) {
if(t.l) debug(t.l);
printf(" %d", a[p].key);
if(t.r) debug(t.r);
}
#undef t
#undef lson
#undef rson
}T;
int main() {
srand(20021111);
char opt[10];
int n=in(), m=in();
for(int i=1;i<=n;++i) T.rt=T.merge(T.rt, T.new_node(in()));
int a, b, c, d, s, t, k;
while(m--) {
scanf("%s", opt), s=in();
if(opt[0]=='T') {
k=T.find_rank(mp[s]);
T.split(T.rt, a, b, k);
T.split(a, a, c, k-1);
T.rt=T.merge(T.merge(c, a), b);
}
else if(opt[0]=='B') {
k=T.find_rank(mp[s]);
T.split(T.rt, a, b, k);
T.split(a, a, c, k-1);
T.rt=T.merge(a, T.merge(b, c));
}
else if(opt[0]=='I') {
t=in();
k=T.find_rank(mp[s]);
if(t>0) {
T.split(T.rt, a, b, k);
T.split(a, a, c, k-1);
T.split(b, b, d, k-T.a[a].size-T.a[c].size+1);
T.rt=T.merge(T.merge(a, b), T.merge(c, d));
}
else if(t<0) {
T.split(T.rt, a, b, k-1);
T.split(a, a, c, k-2);
T.split(b, b, d, k-T.a[a].size-T.a[c].size);
T.rt=T.merge(T.merge(a, b), T.merge(c, d));
}
}
else if(opt[0]=='A') printf("%d\n", T.find_rank(mp[s])-1);
else printf("%d\n", T.kth_id(s));
//T.debug(T.rt);
//putchar('\n');
}
return 0;
}
「luogu2569」[ZJOI2006] 书架的更多相关文章
- 嘴巴题5 「BZOJ1864」[ZJOI2006] 三色二叉树
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1195 Solved: 882 [Submit][Status ...
- 「bzoj1003」「ZJOI2006」物流运输 最短路+区间dp
「bzoj1003」「ZJOI2006」物流运输---------------------------------------------------------------------------- ...
- 「MoreThanJava」Java发展史及起航新世界
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
随机推荐
- python icmp\dns\http监控网络各个节点状态,并记录日志
配置文件如下:支持多节点: { "dns":[{"domainname":"www.baidu.com","dnsserver&q ...
- elk部署之前注意事项
注意事项: 1.不能使用root用户登录,需要是用root 之外的用户登录到系统. 2.centos系统 运行内存不能小于2G,若低于2G需要修改jvm. vi {jvm_home}/config/ ...
- 题解 P2763 【试题库问题】
这题可以用网络流,但我用的是匈牙利算法 进入正题 设第个类型需要个.将每个类型拆成个点,用一个边集数组记录它拆成的点. 第个试题有个类型,分别将与拆成的点连边,这样便构成了一个二分图. 使用匈牙利算法 ...
- 【MySQL 读书笔记】当我们在执行更新语句的时候我们在做什么
该篇其实重点涉及两个日志的使用和处理. 一个是 server 层的 binlog 一个是服务器层的 redolog. 首先还是根据主线来介绍当我们在执行更新语句的时候我们在做什么 Redo Log M ...
- [题解]邮递员寄信(luoguP1629)
题目来源:luoguP1629 题目描述 有一个邮递员要送东西,邮局在结点1.他总共要送N-1样东西,其目的地分别是2-N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条 ...
- jQuery中$.each()方法(遍历)
$.each()是对数组,json和dom结构等的遍历,说一下他的使用方法吧. 1.遍历一维数组 var arr1=['aa','bb','cc','dd']; $.each(arr1,functio ...
- 【LUOGU???】WD与数列 sam 启发式合并
题目大意 给你一个字符串,求有多少对不相交且相同的子串. 位置不同算多对. \(n\leq 300000\) 题解 先把后缀树建出来. DFS 整棵树,维护当前子树的 right 集合. 合并两个集合 ...
- HDU 1757 A Simple Math Problem (矩阵快速幂)
题目 A Simple Math Problem 解析 矩阵快速幂模板题 构造矩阵 \[\begin{bmatrix}a_0&a_1&a_2&a_3&a_4&a ...
- tcpdump常用参数说明及常见操作
tcpdump常用参数说明及常见操作 -a 将网络地址和广播地址转变成名字 -c 指定抓包的数量 -d 将匹配信息包的代码以人们能够理解的汇编格式给出 -dd 将匹配信息包的代码以c语言程序段的格式给 ...
- P1282 多米诺骨牌 (背包变形问题)
题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...