[luoguP2596] [ZJOI2006]书架(splay)
题目中的几个操作,直接splay搞一下即可:
- 把s旋转到根,左子树接到右子树
- 把s旋转到根,右子树接到左子树
- 交换s相邻的信息即可
- 把s旋转到根,左子树的大小即为答案
- 找第k大
没了
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 100000 using namespace std; int n, m, cnt, rt;
int son[N][2], size[N], f[N], pos[N], w[N]; inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} inline int get(int x)
{
return son[f[x]][1] == x;
} inline void update(int x)
{
size[x] = size[son[x][0]] + size[son[x][1]] + 1;
} inline void rotate(int x)
{
int fa = f[x], ffa = f[fa], p = get(x);
son[fa][p] = son[x][p ^ 1], f[son[x][p ^ 1]] = fa;
son[x][p ^ 1] = fa, f[fa] = x;
if(ffa) son[ffa][son[ffa][1] == fa] = x; f[x] = ffa;
update(fa), update(x);
} inline void splay(int x, int y)
{
for(int fa; (fa = f[x]) != y; rotate(x))
if(f[fa] != y) rotate(get(fa) == get(x) ? fa : x);
if(!y) rt = x;
} inline void top_bottom(int x, int p)
{
splay(pos[x], 0);
if(!son[rt][p]) return;
if(!son[rt][p ^ 1]) son[rt][p ^ 1] = son[rt][p], son[rt][p] = 0;
else
{
x = son[rt][p ^ 1];
while(son[x][p]) x = son[x][p];
son[x][p] = son[rt][p], f[son[rt][p]] = x;
son[rt][p] = 0, splay(son[x][p], 0);
}
} inline int build(int l, int r, int fa)
{
if(l > r) return 0;
int mid = (l + r) >> 1, now = ++cnt;
son[now][0] = build(l, mid - 1, now);
w[now] = read(), size[now] = 1, f[now] = fa, pos[w[now]] = now;
son[now][1] = build(mid + 1, r, now);
update(now);
return now;
} inline void ist(int p, int x)
{
if(!p) return;
splay(pos[x], 0);
if(p == -1) p = 0;
x = son[rt][p];
while(son[x][p ^ 1]) x = son[x][p ^ 1];
if(x) swap(pos[w[rt]], pos[w[x]]), swap(w[rt], w[x]);
} inline void ask(int x)
{
splay(pos[x], 0);
printf("%d\n", size[son[rt][0]]);
} inline int query(int k)
{
int x = rt;
while(x)
{
if(size[son[x][0]] + 1 == k) return w[x];
else if(size[son[x][0]] >= k) x = son[x][0];
else k -= size[son[x][0]] + 1, x = son[x][1];
}
} int main()
{
int i, x;
char s[10];
n = read();
m = read();
rt = build(1, n, 0);
for(i = 1; i <= m; i++)
{
scanf("%s", s);
switch(s[0])
{
case 'T': top_bottom(read(), 0); break;
case 'B': top_bottom(read(), 1); break;
case 'I': ist(read(), read()); break;
case 'A': ask(read()); break;
case 'Q': printf("%d\n", query(read())); break;
}
}
return 0;
}
[luoguP2596] [ZJOI2006]书架(splay)的更多相关文章
- P2596 [ZJOI2006]书架 && Splay 区间操作(三)
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
- 洛谷.2596.[ZJOI2006]书架(Splay)
题目链接 /* 五个操作: 1.将某元素置顶.删掉这个数,插入最左 2.将某元素置底.同样 3.旋到根后,直接将这个数与前驱/后继交换所有信息 不是左右子节点! 4.5.裸平衡树 ps:1.用pos[ ...
- BZOJ1861:[ZJOI2006]书架(Splay)
Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ...
- 洛谷 P2596 [ZJOI2006]书架 (splay)
题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些 ...
- [ZJOI2006]书架(权值splay)
[ZJOI2006]书架(luogu) Description 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看 ...
- 洛谷 P2596 [ZJOI2006]书架 解题报告
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
- 「luogu2569」[ZJOI2006] 书架
「luogu2569」[ZJOI2006]书架 题目大意 给定一个长度为 \(n\) 序列,序列中第 \(i\) 个元素有编号 \(a_i(a_i \in \Z \cap [1,n])\),需要支持五 ...
- [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函数中) ...
随机推荐
- 问题 F: 等比数列
问题 F: 等比数列 时间限制: 1 Sec 内存限制: 64 MB提交: 2699 解决: 1214[提交][状态][讨论版][命题人:外部导入] 题目描述 已知q与n,求等比数列之和: 1+q ...
- 《GPU高性能编程CUDA实战中文》中第四章的julia实验
在整个过程中出现了各种问题,我先将我调试好的真个项目打包,提供下载. /* * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. ...
- 快速下载jar包
1, http://www.mvnrepository.com 2,可以从spring官网上下载,如果是mvn的话可以通过上面的网址下载
- curl_easy_setopt函数介绍
本节主要介绍curl_easy_setopt中跟http相关的参数.注意本节的阐述都是以libcurl作为主体,其它为客体来阐述的. 1. CURLOPT_URL 设置访问URL 2. ...
- PowerDesigner导入Excel模板生成实体
在Excel里整理好的表模型数据,可直接导入PowerDesigner.此功能通过PowerDesigner的脚本功能来实现,使用起来也简单.具体操作方法: 打开PowerDesign ...
- 转载:java分布式服务框架Dubbo的介绍与使用
1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...
- 日志收集系统Flume及其应用
Apache Flume概述 Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统.Flume 支持定制各类数据发送方,用于收集各类型数据:同时,Fl ...
- usb gadge驱动设计之我是zero
此处将以zero.c为例进行讲解. 第一次接触zero.c驱动的时候,是因为某项目需要,提供一种usb字符设备,希望能够通过字符设备打开,读取和发送文件.当时能想到的就是zero.c文件,本打算按照z ...
- HDU 1506 Largest Rectangle in a Histogram(单调栈、笛卡尔树)
题意:给定n个连续排列的矩形的高,矩形的宽都为1.问最大矩形覆盖. 例如:n = 7,h[i] = (2 1 4 5 1 3 3),最大覆盖为8. Sample Input 7 2 1 4 5 1 3 ...
- Git-Git初始化
创建版本库及第一次提交 通过如下操作来查看一下您的Git版本. $ git --version git version 1.7.4 在开始 Git 之旅之前,我们需要设置一下 Git 的配置变量,这是 ...