题干: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模板)的更多相关文章

  1. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

  2. 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay

    [阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...

  3. luoguP3391[模板]文艺平衡树(Splay) 题解

    链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...

  4. BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6881  Solved: 4213[Submit][Sta ...

  5. [bzoj3223]文艺平衡树(splay区间反转模板)

    解题关键:splay模板题. #include<cstdio> #include<cstring> #include<algorithm> #include< ...

  6. BZOJ3223 文艺平衡树(splay)

    题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

  7. BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3595  Solved: 2029[Submit][Sta ...

  8. Tyvj P1729 文艺平衡树 Splay

    题目: http://tyvj.cn/p/1729 P1729 文艺平衡树 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 此为平衡树系列第二道:文艺平衡树 ...

  9. BZOJ 3223: Tyvj 1729 文艺平衡树(splay)

    速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...

  10. bzoj3223Tyvj 1729 文艺平衡树 splay

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5644  Solved: 3362[Submit][Sta ...

随机推荐

  1. 算法学习--Day1

    为了冲刺研究生初试,我准备在课余时间捡起往日的算法.多多练习算法题目,提前准备算法的机试. 今天是4月14日,距离算法考试还有两个月的时间吧,这两个月的所学所得我就都记录在这里了.不仅仅包括算法的准备 ...

  2. hdu1162 Eddy's picture 基础最小生成树

    #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> # ...

  3. bzoj2154||洛谷P1829 Crash的数字表格&&JZPTAB && bzoj3309 DZY Loves Math

    bzoj2154||洛谷P1829 https://www.lydsy.com/JudgeOnline/problem.php?id=2154 https://www.luogu.org/proble ...

  4. 模拟 2015百度之星资格赛 1003 IP聚合

    题目传送门 /* 模拟水题,排序后找出重复的ip就可以了 */ #include <cstdio> #include <iostream> #include <algor ...

  5. centOS 部署服务器(二)

    (1)安装nginx 1.下载地址: http://nginx.org/en/download.html ,并解压到目录下 2.安装依赖包 yum -y install pcre*  yum -y i ...

  6. Linux、Windows 下分割、合并rar文件

    1.分割rar 1.1 linux下分割压缩rar 安装rar和unrar和序 $sudo aptitude install rar unrar 示例,分割压缩temp文件,每个包为1MB $rar ...

  7. 获得select被选中option的value和text

    一:JavaScript原生的方法 1:得到select对象: var myselect=document.getElementById(“test”); 2:得到选中项的索引:var index=m ...

  8. BeanUtils.copyProperties(productInfo, productInfoVO);

    一:spring的工具类方法:BeanUtils.copyProperties(orderMasterDTO, orderMasterDO); 作用:将orderMasterDTO对象中的属性值,赋值 ...

  9. 第一次提交代码到github时经常遇到的问题

    最近两年在OpenStack方面做了一些工作,写了一些实验性的plugin. 本着Open Source的共享精神,想尝试提交到github,以便他人能下载使用. 当你注册完github帐号之后,点击 ...

  10. nginx 访问localhost老是下载文件不能打开网页什么情况?

    nginx打开网页直接下载文件的问题 nginx sites-available文件里的default已经修改过root 路径了. 但是访问localhost的时候总是直接下载网页而不是打开网址 很奇 ...