传送门

题目中的几个操作,直接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. python_68_迭代器

    ''' 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...

  2. 前端-带header和footer的双栏布局

    目标是实现如上图带header和footer的双栏布局,其中右侧sidebar是固定宽度,左侧content是自适应: https://www.zybuluo.com/dengzhirong/note ...

  3. A1020 Tree Traversals (25 分)

    Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...

  4. Java 批量文件压缩导出,并下载到本地

    主要用的是org.apache.tools.zip.ZipOutputStream  这个zip流,这里以Execl为例子. 思路首先把zip流写入到http响应输出流中,再把excel的流写入zip ...

  5. 【JAVA】mac配置java环境变量

    如果用bash,修改~/.bash_profile 或 ~/.profile: 如果用zsh,修改-/.zshrc 修改这些文件之后,重修打开terminal,配置不会丢 首先确保已经安装了jdk: ...

  6. php获取随机字符串

    获取随机字符串 /** * 获取随机字符串 * @param int $randLength 长度 * @param int $addtime 是否加入当前时间戳 * @param int $incl ...

  7. tcl之string操作

  8. java util - 在java代码中执行javascript代码工具 rhino-1.7.7.jar

    需要 rhino-1.7.7.jar 包 代码示例: package cn.java.mozilla.javascript; import org.mozilla.javascript.Context ...

  9. Redis之Hash类型操作

    接口IRedisDaoHash: package com.net.test.redis.base.dao; import com.net.test.redis.base.entity.UserPsg; ...

  10. Darwin's Letter【达尔文的信】

    Darwin's Letter A letter written by Charles Darwin in 1875 has been returned to the Smithsonian Inst ...