文艺平衡树(splay模板)
题干:splay模板,要求维护区间反转。
splay是一种码量小于treap,但支持排名,前驱后继等treap可求的东西,也支持区间反转的平衡树。
但是有两个坏处:
1.splay常数远远大于treap以及stl中的set。
2.没有可持久化splay,但有可持久化treap。
下面是代码:
1.pushup以及pushdown
pushup用于维护某点所在子树大小。
void pushup(int u)
{
tr[u].siz = tr[tr[u].ch[]].siz + tr[tr[u].ch[]].siz + ;
}
一行。
pushdown用于标记下推。
void pushdown(int u)
{
if(tr[u].mrk)
{
tr[u].mrk=;
swap(tr[u].ch[],tr[u].ch[]);
tr[tr[u].ch[]].mrk^=;
tr[tr[u].ch[]].mrk^=;
}
}
2.rotate
rotate相当于treap中的lturn和rturn,是将x点转到他的父节点处。
void rotate(int x)
{
int y = tr[x].fa;
int z = tr[y].fa;
int k = (tr[y].ch[]==x);
tr[x].fa = z,tr[z].ch[tr[z].ch[]==y]=x;
tr[y].ch[k] = tr[x].ch[k^],tr[tr[x].ch[k^]].fa = y;
tr[y].fa = x,tr[x].ch[k^]=y;
pushup(y),pushup(x);
}
注意改变父子关系时的顺序问题,还有两个pushup,应该先pushup儿子后pushup父亲。
3.splay(splay核心操作)
splay(a,b),将a旋转到b的儿子处。
下面是双旋splay:
void splay(int x,int goal)
{
while(tr[x].fa!=goal)
{
int y = tr[x].fa;
int z = tr[y].fa;
if(z!=goal)
((tr[z].ch[]==y)^(tr[y].ch[]==x))?rotate(x):rotate(y);
rotate(x);
}
if(goal==)rot=x;
}
代码中while中的if,机房普遍认为是为了维护整棵树的深度。
4.insert
码量比treap少很多:
void insert(int x)
{
int u = rot,fa;
while(u)fa=u,u=tr[u].ch[tr[u].v<x];
u=++tot;
if(fa)tr[fa].ch[x>tr[fa].v]=u;
tr[u].fa = fa,tr[u].v = x,tr[u].siz = ;
splay(u,);
}
5.查询排名
代码:
int query_kth(int k)
{
int u = rot;
while()
{
pushdown(u);
int t = tr[tr[u].ch[]].siz;
if(t==k-)return u;
else if(t>=k)u=tr[u].ch[];
else k-=t+,u=tr[u].ch[];
}
}
6.区间旋转
先查询前驱后继,然后把所在子树夹到前驱后继之间,一个标记解决问题。
void chg(int l,int r)
{
l = query_kth(l);//前驱
r = query_kth(r+);//后继
splay(l,);splay(r,l);
tr[tr[tr[rot].ch[]].ch[]].mrk^=;
}
最后:
推极大极小,推极大极小,推极大极小!!!
全代码就不粘了。
文艺平衡树(splay模板)的更多相关文章
- [洛谷P3391] 文艺平衡树 (Splay模板)
初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...
- 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay
[阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...
- luoguP3391[模板]文艺平衡树(Splay) 题解
链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...
- BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6881 Solved: 4213[Submit][Sta ...
- [bzoj3223]文艺平衡树(splay区间反转模板)
解题关键:splay模板题. #include<cstdio> #include<cstring> #include<algorithm> #include< ...
- BZOJ3223 文艺平衡树(splay)
题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
- Tyvj P1729 文艺平衡树 Splay
题目: http://tyvj.cn/p/1729 P1729 文艺平衡树 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 此为平衡树系列第二道:文艺平衡树 ...
- BZOJ 3223: Tyvj 1729 文艺平衡树(splay)
速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...
- bzoj3223Tyvj 1729 文艺平衡树 splay
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5644 Solved: 3362[Submit][Sta ...
随机推荐
- C++开发工程师面试题库 200~250道
199 MFC中SendMessage和PostMessage的区别?答:PostMessage 和SendMessage的区别主要在于是否等待应用程序做出消息处理.PostMessage只是把消息 ...
- bzoj 3594: [Scoi2014]方伯伯的玉米田【二维树状数组+dp】
设f[i][j]为前i棵玉米被拔高了j(因为是单调不降所以前面越高越好,所以每次拔一个前缀),转移是f[i][j]=f[k][l]+1,l<=j,a[k]+l<=a[i]+j,然后用二维树 ...
- PAT 1035 插入与归并(25)
原题:https://pintia.cn/problem-sets/994805260223102976/problems/994805286714327040传送门: 根据维基百科的定义: 插入排序 ...
- UITableViewCell添加点击时改变字体的颜色、背景、图标
改变字体颜色:cell.textLabel.highlightedTextColor 改变背景颜色:cell.selectedBackgroundView (必须是图片哦) 改变图标颜色:cell.i ...
- URAL 7077 Little Zu Chongzhi's Triangles(14广州I)
题目传送门 题意:有n根木棍,三根可能能够构成三角形,选出最多的三角形,问最大面积 分析:看到这个数据范围应该想到状压DP,这次我想到了.0010101的状态中,1表示第i根木棍选择,0表示没选,每一 ...
- CentOS 7.4安装mariadb,启动报错
[root@iZ25b6alxstZ ~]# systemctl start mariadb Job for mariadb.service failed because the control pr ...
- CF985E Pencils and Boxes
思路: 先对a数组排序,然后使用动态规划.dp[i]表示前i个能否正确划分.则如果存在dp[j] == 1, i - j + 1 >= k并且a[i] - a[j] < d,那么dp[i] ...
- 6 Specialzed layers 特殊层 第二部分 读书笔记
CAGradientLayer CAGradientLayer is used to generate a smooth gradient between two or more colors. ...
- SQLite概述
SQLite概述 这个教程帮助您理解SQLite是什么,它如何不同于SQL,为什么它是必要的和它的方式处理应用程序数据库. SQLite是一个库,实现了一个独立的软件,serverless zer ...
- (转)SpringMVC学习(七)——Controller类的方法返回值
http://blog.csdn.net/yerenyuan_pku/article/details/72511844 本文所有案例代码的编写均建立在前文SpringMVC学习(六)——SpringM ...