维护书架

金牌导航 无旋式treap-1

题目大意

给出一个序列a,编号为1~n,让你做若干操作,操作有五种:
1.把第x个数放在最前面
2.把第x个数放在最后面
3.把第x个数和第x±1x\pm 1x±1个数交换
4.查询编号为i的数前面有多少个数
5.查询第i个数的编号

输入样例

10 10
1 3 2 7 5 8 10 4 9 6
Query 3
Top 5
Ask 6
Bottom 3
Ask 3
Top 6
Insert 4 -1
Query 5
Query 2
Ask 2

输出样例

2
9
9
7
5
3

数据范围

3⩽n,m⩽8×104,1⩽ai⩽n3\leqslant n,m\leqslant 8\times 10^4,1\leqslant a_i\leqslant n3⩽n,m⩽8×104,1⩽ai​⩽n

解题思路

用无旋式treap维护该数列
前三项就先把数字拆出来,然后再按要求放回去
对于操作四,在建点的时候寄一个标记,记下编号为x的数在树中的编号,然后搜一下就行了
对于操作五,就直接搜就行了(代码里是把书拆开,因为可以省去打一个函数)

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define sto_wyc_orz 666666
#define N 80080
using namespace std;
int n, m, x, y, w, t1, t2, t3, t4, rt, v[N], s[N], fa[N], ls[N], rs[N], pri[N], size[N];
string str;
void up(int x)
{size[x] = size[ls[x]] + size[rs[x]] + 1;return;
}
int newnode(int x)//建点
{s[++w] = x;pri[w] = rand();size[w] = 1;v[x] = w;return w;
}
int merge(int x, int y)//合并
{if (!x || !y) return x + y;if (pri[x] < pri[y]){rs[x] = merge(rs[x], y);fa[rs[x]] = x;up(x);return x;}else{ls[y] = merge(x, ls[y]);fa[ls[y]] = y;up(y);return y;}
}
void split(int x, int k, int &a, int &b, int faa, int fab)//拆分
{if (!x){a = b = 0;return;}if (k <= size[ls[x]]){fa[x] = fab;b = x;split(ls[x], k, a, ls[x], faa, x);}else{fa[x] = faa;a = x;split(rs[x], k - size[ls[x]] - 1, rs[x], b, x, fab);}up(x);
}
void insert(int x, int y)
{split(rt, x, t1, t2, 0, 0);rt = merge(t1, merge(newnode(y), t2));
}
int find(int x)
{int sum = size[ls[x]] + 1;while(x != rt){if (x == rs[fa[x]]) sum += size[ls[fa[x]]] + 1;x = fa[x];}return sum;
}
int main()
{srand(sto_wyc_orz);scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++i){ scanf("%d", &x);insert(i - 1, x);}while(m--){cin>>str;scanf("%d", &x);if (str == "Top"){x = find(v[x]);split(rt, x, t1, t3, 0, 0);split(t1, x - 1, t1, t2, 0, 0);//拆分再按要求合并rt = merge(t2, merge(t1, t3));}if (str == "Bottom"){x = find(v[x]);split(rt, x, t1, t3, 0, 0);split(t1, x - 1, t1, t2, 0, 0);rt = merge(t1, merge(t3, t2));}if (str == "Insert"){scanf("%d", &y);x = find(v[x]);if (y > 0){split(rt, x + 1, t3, t4, 0, 0);split(t3, x, t2, t3, 0, 0);split(t2, x - 1, t1, t2, 0, 0);rt = merge(merge(t1, t3), merge(t2, t4));}else if (y < 0){split(rt, x, t3, t4, 0, 0);split(t3, x - 1, t2, t3, 0, 0);split(t2, x - 2, t1, t2, 0, 0);rt = merge(merge(t1, t3), merge(t2, t4));}}if (str == "Ask"){printf("%d\n", find(v[x]) - 1);}if (str == "Query"){split(rt, x, t1, t2, 0, 0);y = t1;while(rs[y]) y = rs[y];//拆分后找最右边的,即第x个printf("%d\n", s[y]);rt = merge(t1, t2);}}return 0;
}

【FHQ treap】维护书架(金牌导航 无旋式treap-1)相关推荐

  1. luogu P2596 [ZJOI2006]书架(平衡树、无旋treap(按排名分裂)一些更复杂的操作)

    P2596 [ZJOI2006]书架 无旋treap可以维护一棵树的中序遍历结果.但是不支持通过编号来找节点.于是在无旋treap的基础上,我维护了每个节点的父亲,这样就可以求出一个节点是中序遍历中的 ...

  2. 模板 - FHQ - treap 无旋平衡树

    整理的算法模板合集: ACM模板 目录 FQH - treap 无旋平衡树 按权值分裂 按排名分裂 文艺平衡树 可持久化序列 FQH - treap 无旋平衡树 operator 1 : 插入一个数 ...

  3. 浅尝无旋Treap (基于洛谷P3391 文艺平衡树)

    说是浅尝吧,确实也挺浅的,完全是基于下面这道题写的↓ 洛谷P3391 自己去看题,我是懒得粘了... 分析 其实也没有什么好分析的,这就是一道Splay树的模板题,解决一般的Treap不能解决的区间维 ...

  4. 无旋treap的简单思想以及模板

    因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...

  5. BST、AVL、BTree、B+Tree、B*Tree、23Tree、234Tree、TTree、RBTree、LLRBTree、AATree、SplayTree、Treap、无旋Treap、scap

    喜欢这篇文章吗?喜欢的话去看博主的置顶博客,即可依据分类找到此文章的原版得到更好的体验, 图片及代码显示的问题,笔者深感抱歉,想要更好的体验去原博文即可. title: tree mathjax: t ...

  6. 模板:无旋treap

    文章目录 前言 操作 合并 分裂 插入 删除 查找第k大 查询x的排名 前驱后继 完整代码 所谓无旋treap,就是不带旋转的treap 前言 现在"理论上"我会四种平衡树了 之前 ...

  7. 无旋treap 文艺平衡树

    因为需要用到区间修改,所以该用splay(尚未填坑)或者无旋treap(刚刚填上) 最开始的建树用到了建笛卡尔树的方法,把id大于当前点的点不断出栈,又因为这道题的点是按序入栈的,所以当它无法让更多点 ...

  8. FHQ Treap及其可持久化与朝鲜树式重构

    FHQ Treap,又称无旋treap,一种不基于旋转机制的平衡树,可支持所有有旋treap.splay等能支持的操作(只有在LCT中会比splay复杂度多一个log).最重要的是,它是OI中唯一一种 ...

  9. 【luogu P4036】【ybt金牌导航4-5-3】火星人

    火星人 题目链接:luogu P4036 / ybt金牌导航4-5-3 题目大意 给你一个字符串,要你维护三个东西. 修改字符串的一个字符,往字符串的一个地方插入一个字符,询问两个后缀的最长公共前缀. ...

最新文章

  1. 数字信号的最佳接收理论
  2. Leetcode1705. 吃苹果的最大数目[C++题解]:贪心
  3. Android__Context
  4. 使用opencv的LBF算法进行人脸关键点检测
  5. Sql Server中判断日志是否为一个星期
  6. 运动目标跟踪(十九)--TLD
  7. AsnycTask的内部的实现机制
  8. 数百亿的新疆安防市场,集成巨头告诉你如何才能从中分杯羹
  9. [偏相关分析]偏相关系数计算及假设检验
  10. 三菱伺服驱动器MR-J2S 70A伺服驱动器电源驱动板图纸
  11. nodejs爬虫实战_实战nodejs写网络爬虫
  12. dlna android电视,DLNA推送安卓手机投屏电视
  13. opencv图片保存0字节_openCV中IplImage的使用
  14. 网络云存储技术Windows server 2012 (项目十八 部署高可用链路的iSCSI(基于MPIO))
  15. 芝麻信用行业关注名单风险标签对照表SQL---福利大家!
  16. 机器人被挠脚心_《fm及机器人系列(tk)》专题
  17. CSS 的background-size:cover属性值和contain属性值
  18. 最新WIN10系统封装教程2019系列(五)——使用工具优化与清理
  19. java ip地址接口_java获取ip地址与网络接口的方法示例
  20. 华为技术服务工程师实习生面试(已拿到offer)

热门文章

  1. php restful规范,RESTFul API规范 详细指南
  2. c语言查单词小程序,【附源码】小程序初窥之简单查单词
  3. 后端学习 - 计算机网络
  4. 软件构造学习笔记-实验1
  5. C++ 学习之旅(14)——构造函数constructors和析构函数destructors
  6. redis storm mysql_flume+kafka+storm+redis/mysql启动命令记录
  7. [Spring5]IOC容器_Bean管理注解方式_注入属性@Autowired_@Qualified_@Resource_@Value
  8. C++this指针的用途
  9. 交通标志识别项目教程
  10. icoding复习5 树 感觉难度巨大....