传送门

题目中的几个操作,直接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. dubbo + zookeeper 配置

      Dubbo与Zookeeper.SpringMVC整合和使用 windows环境介绍: myeclipse 10 jdk1.6 tomcat 6.0.35 一.安装Zookeeper 1.通过链接 ...

  2. 2018年ElasticSearch6.2.2教程ELK搭建日志采集分析系统(教程详情)

    章节一  2018年 ELK课程计划和效果演示1.课程安排和效果演示    简介:课程介绍和主要知识点说明,ES搜索接口演示,部署的ELK项目演示    es: localhost:9200    k ...

  3. Tesseract-ocr视觉学习-验证码识别及python import pytesseract使用

    Tesseract-OCR的简单使用与训练 最近看到某个网站提交数据要提交验证码,用tesseract自带的识别, 识别出来是什么鬼,0-9识别成了什么玩意! so决定自己训练下tesseract.. ...

  4. MTCNN学习进展

    20190618 截止今日,学习了MTCNN预测部分的内容,包括三个网络输入输出之类的东西. 之后需要进一步学习的,NMS原理鞋机,MTCNN训练过程细节,损失函数细节

  5. python3 爬取汽车之家所有车型数据操作步骤(更新版)

    题记: 互联网上关于使用python3去爬取汽车之家的汽车数据(主要是汽车基本参数,配置参数,颜色参数,内饰参数)的教程已经非常多了,但大体的方案分两种: 1.解析出汽车之家某个车型的网页,然后正则表 ...

  6. jQuery+Asp.net 实现简单的下拉加载更多功能

    原来做过的商城项目现在需要增加下拉加载的功能,简单的实现了一下.大概可以整理一下思路跟代码. 把需要下拉加载的内容进行转为JSON处理存在当前页面: <script type="tex ...

  7. 组装需要的json数据格式

    在实际项目中有时候会遇到一些有特殊要求的控件,比如easyui-combogrid,加载的并不是常见的json格式,这里我遇到过需要加载类似省市县这种三级数据格式.最后也是从别人的博客中学到的如何组装 ...

  8. Django之session验证的三种姿势

    一.什么是session session是保存在服务端的键值对,Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中. 二.FVB中 ...

  9. privoxy+ss5实现 HTTP 代理协议转socks5代理

    一.系统准备资源         二.ss5安装部署 1.SOCK5代理服务器部署环境准备 IP:10.0.0.100 官网: http://ss5.sourceforge.net/ 下载 yum - ...

  10. mac攻略(九) -- ssh工具secureCRT

    mac ssh 客户端 : 本身mac直接使用终端来ssh连接就很方便,但是使用过程中随着远程服务器的增多和zsh和远程服务器编码不同产生了乱码,决定安装一款ssh终端软件,以下方法亲测可用,感谢提供 ...