【模板】 Splay树
Splay
Messenger(板子题)
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;char str[N];namespace Splay{struct Node{int son[2];int fa, val, size, cnt;int rev;}t[N];int root, tot;void push_up(int x){t[x].size = t[t[x].son[0]].size + t[t[x].son[1]].size + 1;}void push_down(int x){if(t[x].rev){swap(t[x].son[0], t[x].son[1]);t[ t[x].son[0] ].rev ^= 1;t[ t[x].son[1] ].rev ^= 1;t[x].rev = 0;}}int getson(int x){return t[t[x].fa].son[1] == x;}//是父亲哪个儿子void rotate(int x){int y = t[x].fa, z = t[y].fa, tt = getson(x);if(z)t[z].son[getson(y)] = x;else root = x;t[x].fa = z;int tmp = t[x].son[!tt];t[y].son[tt] = tmp;if(tmp)t[tmp].fa = y;t[x].son[!tt] = y;t[y].fa = x;push_up(y), push_up(x);}void splay(int x, int goal){//让序号为x的节点做goal的儿子while(t[x].fa != goal){int y = t[x].fa, z = t[y].fa;if(z != goal)(getson(x) == getson(y)) ? rotate(y) : rotate(x);rotate(x);}if(goal == 0) root = x; }int kth(int x){//找第k大的数int u = root;while(1){push_down(u);if(t[u].son[0] && x <= t[t[u].son[0]].size){u = t[u].son[0];}else {int tmp = (t[u].son[0] ? t[t[u].son[0]].size : 0) + 1;if(x == tmp)return u;x -= tmp;u = t[u].son[1];}}}void insert(int x){int u = root, fa = 0;while(u && t[u].val != x){fa = u;u = t[u].son[x > t[u].val];}//if(u) t[u].cnt++;u = ++tot;t[u].cnt = t[u].size = 0;t[u].son[0] = t[u].son[1] = 0;t[u].fa = fa;t[u].val = x;if(fa) t[fa].son[x > t[fa].val] = u;splay(u, 0);}void splay_rev(int l, int r){int ed = kth(r + 1), st = kth(l - 1);splay(st, 0);splay(ed, st);t[ t[ed].son[0] ].rev ^= 1;}void print(int p){if(!p) return;push_down(p);print(t[p].son[0]);if(t[p].val != -inf && t[p].val != inf)printf("%c",str[t[p].val]);print(t[p].son[1]);}
}
using namespace Splay;
int main(){scanf("%[^\n]", str + 1); getchar();int len = strlen(str + 1);insert(-inf);for(int i = 1; i <= len; i++) insert(i);insert(inf);int m;scanf("%d", &m);while(m--){int p;scanf("%d", &p);splay_rev(1 + 1, 1 + p);splay_rev(1 + p + 1, 1 + len);}print(root);
}
【模板】 Splay树相关推荐
- poj 3468 Splay 树
大二上的时候.写过一个AVL的操作演示,今天一看Splay.发现和AVL事实上一样,加上线段树的基础,懒惰标记什么都知道.学起来轻松很多哦 我參考的模板来自这里 http://blog.csdn.n ...
- 平衡树【Splay树】学习小记
简介 平衡树,顾名思义,平衡的搜索二叉树. 常见的平衡树都能将树的深度保持在 lg n \lg_n lgn 的级别内,防止退化成链. 一些平衡树可以通过旋转.分裂.合并等操作完成更加高级的.二叉 ...
- 8.1 Splay树
参考博客: https://blog.csdn.net/hellochenlu/article/details/53022709 参考博客: https://blog.csdn.net/amoscyk ...
- AVL树、splay树(伸展树)和红黑树比较
AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...
- P3374 【模板】树状数组 1
P3374 [模板]树状数组 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示 ...
- 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...
- 最长上升子序列三种模板(n^2模板,二分模板,树状数组模板)
最长上升子序列(LIS)是动态规划的入门.总结下来,经常用的模板一共有三种,分别为n^2模板,二分模板,树状数组模板. n^2模板代码如下: //n^2算法,本质就是dp,采用二重循环的方式.对于数据 ...
- P3374 【模板】树状数组 1( 单点修改 + 区间查询 )
题目链接:点击进入 题目 思路深入学习 树状数组实现-> 单点修改 + 区间查询 c [ i ] = a ( i - 2 ^ k + 1 ) + - + a [ i ] ( 设节点编号为 i , ...
- 洛谷P3374 【模板】树状数组 1
题目链接:[模板]树状数组 1 - 洛谷 模板题就不多说了 ac代码: #include <cstdio> #include <iostream> #include <a ...
- [P3374 【模板】树状数组 1](单点修改,区间查询)
*P3374 [模板]树状数组 1* 第一道线段树的题,很好的板子题,中文体面就不过多解释了. 直接上代码(注释很详细了,前提学过线段树) #include<bits/stdc++.h> ...
最新文章
- 【Qt】QtCreator中的单例编程(以ActionManager为例)
- Win32API 窗口程序的创建7大步骤
- 三重for循环优化_MATALB中对循环操作的优化
- 一款功能齐全的网管软件:Ip-tools
- 使用 PHPMAILER 发送邮件实例
- WPF定时刷新UI界面
- 模拟耗时操作_在集成测试中模拟耗时的动作
- LeetCode 1306. 跳跃游戏 III(广度优先搜索BFS)
- 消息中间件系列(三):主流的消息队列中间件有哪些?
- ArrayList源码浅析
- Oracle SQL语句执行步骤
- camera---(4)双摄像头分类
- 前端面试题大集合:来自真实大厂的532道面试题(只有题,没有答案)
- bzoj 4260: Codechef REBXOR(01字典树)
- Ubuntu18.04安装网络调试助手 NetAssist
- 如何解决电脑触控板不能使用的问题 (双指上下滑动翻页)
- moment.js计算时间差
- 为什么感觉现在电脑病毒少了?
- 物理地址通过什么协议转换为ip地址
- Android 利用高德地图API进行定位、开发电子围栏、天气预报、轨迹记录、搜索周边(位置)