传送门

题目中的几个操作,直接splay搞一下即可:

  1. 把s旋转到根,左子树接到右子树
  2. 把s旋转到根,右子树接到左子树
  3. 交换s相邻的信息即可
  4. 把s旋转到根,左子树的大小即为答案
  5. 找第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)的更多相关文章

  1. P2596 [ZJOI2006]书架 && Splay 区间操作(三)

    P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...

  2. 洛谷.2596.[ZJOI2006]书架(Splay)

    题目链接 /* 五个操作: 1.将某元素置顶.删掉这个数,插入最左 2.将某元素置底.同样 3.旋到根后,直接将这个数与前驱/后继交换所有信息 不是左右子节点! 4.5.裸平衡树 ps:1.用pos[ ...

  3. BZOJ1861:[ZJOI2006]书架(Splay)

    Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ...

  4. 洛谷 P2596 [ZJOI2006]书架 (splay)

    题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些 ...

  5. [ZJOI2006]书架(权值splay)

    [ZJOI2006]书架(luogu) Description 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看 ...

  6. 洛谷 P2596 [ZJOI2006]书架 解题报告

    P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...

  7. 「luogu2569」[ZJOI2006] 书架

    「luogu2569」[ZJOI2006]书架 题目大意 给定一个长度为 \(n\) 序列,序列中第 \(i\) 个元素有编号 \(a_i(a_i \in \Z \cap [1,n])\),需要支持五 ...

  8. [Luogu 2596] ZJOI2006 书架

    [Luogu 2596] ZJOI2006 书架 第一次指针写 FHQ_Treap(省选噩梦数据结构)AC 啦! 省选试机写它,紧张过度失败了. 省选 Day 1 考场写它,写挂了. 省选 Day 1 ...

  9. fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架

    题面:P2596 [ZJOI2006]书架 题解:记录每本书对应的节点编号 普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中) ...

随机推荐

  1. 2017.12.1 如何用java写出一个菱形图案

    上机课自己写的代码 两个图形原理都是一样的 1.一共有仨个循环 注意搞清楚每一层循环需要做的事情 2.第一层循环:是用来控制行数 3.第二层循环控制打印空格数 4.第三层循环是用来循环输出星星 imp ...

  2. 解决linux系统CentOS下调整home和根分区大小《转》

    转自http://www.php114.net/2013/1019/637.html 目标:将VolGroup-lv_home缩小到20G,并将剩余的空间添加给VolGroup-lv_root   1 ...

  3. python剑指offer 顺时针打印指针

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  4. react树状组件

    最近在react项目中需要一个树状组件,但是又不想因为这个去引入一套UI组件,故自己封装了一个基于react的树状组件, 个人认为比较难得部分在于数据的处理,话不多说直接上代码: 下面是tree.js ...

  5. React后台管理系统-rich-editor组件

    1.Simditor组件的github地址:https://github.com/mycolorway/simditor 网址:http://simditor.tower.im/ 2.在util里边新 ...

  6. 如何利用WordPress的菜单功能实现友情链接功能?

    导语:对于wordpress网站的友情链接,有很多种方法可以实现,例如我们可以利用WordPress的链接功能,或者利用WordPress的菜单功能.本文章介绍的是如何利用菜单功能来实现友情链接. 前 ...

  7. Oracle 自动生成hive建表语句

    从 oracle 数据库导数到到 hive 大数据平台,需要按照大数据平台的数据规范,重新生成建表的 SQL 语句,方便其间,写了一个自动生成SQL的存储过程. ① 创建一张表,用来存储源表的结构,以 ...

  8. 黑马基础阶段测试题:定义一个int类型的数组,数组中元素为{5,7,3,9,4}。求出数组中的最小值,并判断最小值是否为偶数,如果是偶数则输出“最小值为偶数”,如果不是偶数则输出“最小值为奇数”。打印如下:

    package com.swift; import java.util.Arrays; public class ArrayTest { public static void main(String[ ...

  9. css中让元素隐藏的多种方法

    { display: none; /* 不占据空间,无法点击 / } { visibility: hidden; / 占据空间,无法点击 / } { position: absolute; top: ...

  10. Eclipse 发布 JAR

    明确要生成何种类型 jar 生成工具 jar,作为包被其他程序调用 具体步骤: 选中项目文件,点右键选择 Export ,JAR File 在弹出窗口选择,导出哪些文件,并且选择好 输出 JAR 的路 ...