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树相关推荐

  1. poj 3468 Splay 树

    大二上的时候.写过一个AVL的操作演示,今天一看Splay.发现和AVL事实上一样,加上线段树的基础,懒惰标记什么都知道.学起来轻松很多哦 我參考的模板来自这里  http://blog.csdn.n ...

  2. 平衡树【Splay树】学习小记

    简介 平衡树,顾名思义,平衡的搜索二叉树. 常见的平衡树都能将树的深度保持在 lg ⁡ n \lg_n lgn​ 的级别内,防止退化成链. 一些平衡树可以通过旋转.分裂.合并等操作完成更加高级的.二叉 ...

  3. 8.1 Splay树

    参考博客: https://blog.csdn.net/hellochenlu/article/details/53022709 参考博客: https://blog.csdn.net/amoscyk ...

  4. AVL树、splay树(伸展树)和红黑树比较

    AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...

  5. P3374 【模板】树状数组 1

    P3374 [模板]树状数组 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示 ...

  6. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  7. 最长上升子序列三种模板(n^2模板,二分模板,树状数组模板)

    最长上升子序列(LIS)是动态规划的入门.总结下来,经常用的模板一共有三种,分别为n^2模板,二分模板,树状数组模板. n^2模板代码如下: //n^2算法,本质就是dp,采用二重循环的方式.对于数据 ...

  8. P3374 【模板】树状数组 1( 单点修改 + 区间查询 )

    题目链接:点击进入 题目 思路深入学习 树状数组实现-> 单点修改 + 区间查询 c [ i ] = a ( i - 2 ^ k + 1 ) + - + a [ i ] ( 设节点编号为 i , ...

  9. 洛谷P3374 【模板】树状数组 1

    题目链接:[模板]树状数组 1 - 洛谷 模板题就不多说了 ac代码: #include <cstdio> #include <iostream> #include <a ...

  10. [P3374 【模板】树状数组 1](单点修改,区间查询)

    *P3374 [模板]树状数组 1* 第一道线段树的题,很好的板子题,中文体面就不过多解释了. 直接上代码(注释很详细了,前提学过线段树) #include<bits/stdc++.h> ...

最新文章

  1. 【Qt】QtCreator中的单例编程(以ActionManager为例)
  2. Win32API 窗口程序的创建7大步骤
  3. 三重for循环优化_MATALB中对循环操作的优化
  4. 一款功能齐全的网管软件:Ip-tools
  5. 使用 PHPMAILER 发送邮件实例
  6. WPF定时刷新UI界面
  7. 模拟耗时操作_在集成测试中模拟耗时的动作
  8. LeetCode 1306. 跳跃游戏 III(广度优先搜索BFS)
  9. 消息中间件系列(三):主流的消息队列中间件有哪些?
  10. ArrayList源码浅析
  11. Oracle SQL语句执行步骤
  12. camera---(4)双摄像头分类
  13. 前端面试题大集合:来自真实大厂的532道面试题(只有题,没有答案)
  14. bzoj 4260: Codechef REBXOR(01字典树)
  15. Ubuntu18.04安装网络调试助手 NetAssist
  16. 如何解决电脑触控板不能使用的问题 (双指上下滑动翻页)
  17. moment.js计算时间差
  18. 为什么感觉现在电脑病毒少了?
  19. 物理地址通过什么协议转换为ip地址
  20. Android 利用高德地图API进行定位、开发电子围栏、天气预报、轨迹记录、搜索周边(位置)

热门文章

  1. C# 读取台达PLC
  2. 配置Swagger带token的三种方式
  3. 文件下载中文文件名不显示
  4. 华为 P20 Pro 相机体验报告
  5. c++简单快速理解QueryInterface(带图)
  6. C语言基本概念----类型
  7. 关于PacketShaper和Netflow Tracker软件的同步
  8. 膝盖中了一箭之康复篇-第六个月
  9. 4种锻炼方法保护你的视力
  10. JavaScript/ES6 从this开始理解apply() call() bind()、 class 、箭头函数