[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函数中) ...
随机推荐
- Problem G: 圆周率
Problem G: 圆周率 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 155 Solved: 99[Submit][Status][Web Bo ...
- Linux学习记录(一)
1.Linux的简介 1.1.Linux的概述 Linux是基于Unix的开源免费的操作系统,由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境.Linux是由Linus Torvalds(林 ...
- github相关问题
一.项目编译打包后生成的dist文件夹后:项目提交到github上dist文件提交不上去. 在.gitignore文件,删除一行 二.更改github的语言属性 .gitattributes文件:若项 ...
- 洛谷P1481 魔族密码(LIS)
题意 题目链接 给出一堆字符串,若一个串是另一个串的前缀 ,那么它们可以连接在一起 问最大的链接长度 Sol LIS沙比提其实是做完了才看出是LIS #include<cstdio> #i ...
- mysql 删除 一天前 创建 的数据,计算时间差
DELETE from table_name WHERE TIMESTAMPDIFF(SECOND ,CREATE_TIME,now() ) > 24*60*60 https://www.cnb ...
- Vue -computed传参数
vue 中computed想传递参数怎么办? 闭包在这里起到的重要的作用 <input v-model="newItem(key,val)" type="text& ...
- Python 文件读写 文件和路径
1.在Windows上,使用倒斜杆作为文件夹之间的分隔符,在Linux上,使用正斜杠作为路径分隔符.在编写Python脚本时,可以os.path.join()函数来处理 在Windows环境下命令如下 ...
- 【PHP】Thinkphp 七牛云API对接
访问一个网站,图片的流量占的比例是非常高的!在你的服务器硬盘上,图片占的容量也是非常高的. 如果要搞一个图片非常多,用户量又很庞大的网站,那么,得花多少钱烧在服务器上? 这种时候,当然要用第三方图片存 ...
- nginx+django线上部署
(一):背景在线 由于现在工作的需要,我需要使用Python来进行一个网站后台的开发,python之前接触过其语法的学习,基本的东西已经掌握,但是当时自学的时候是学得python3.5,而现在要使用p ...
- JZOJ 1266. 玉米田
1266. 玉米田(cowfood.pas/c/cpp) (File IO): input:cowfood.in output:cowfood.out Time Limits: 1000 ms Me ...