博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
splay详解(三)
阅读量:5115 次
发布时间:2019-06-13

本文共 647 字,大约阅读时间需要 2 分钟。

前言

上一节我们学习了splay所能解决的基本问题,这节我来讲一下splay怎么搞区间问题

实现

splay搞区间问题非常简单,比如我们要在区间$l,r$上搞事情,那么我们首先把$l$的前驱旋转到根节点

再把$r$的后继旋转到根节点的右儿子

那么此时根节点的右儿子的左儿子所代表的就是区间$l,r$

这个应该比较好理解

然后就可以像线段树的lazy标记一样,给区间$l,r$打上标记,延迟更新,比如区间反转的时候更新的时候直接交换左右儿子

这里有一个技巧:如果一个区间被打了两次,那么就相当于不打

所以我们用一个bool变量来储存该节点是否需要被旋转

下传函数可以这么写

inline void pushdown(int x){    if(tree[x].rev)    {        swap(tree[x].ch[0],tree[x].ch[1]);        tree[tree[x].ch[0]].rev^=1;        tree[tree[x].ch[1]].rev^=1;            tree[x].rev=0;    }}

 

 

注意每次rotate的时候先下传标记

例题

http://www.cnblogs.com/zwfymqz/p/7899355.html

http://www.cnblogs.com/zwfymqz/p/7899271.html

转载于:https://www.cnblogs.com/zwfymqz/p/7899379.html

你可能感兴趣的文章
pair的例子
查看>>
前端框架性能对比
查看>>
@property中 retain 详解
查看>>
java8 stream初试,map排序,list去重,统计重复元素个数,获取map的key集合和value集合...
查看>>
Python爬虫个人记录(四)利用Python在豆瓣上写一篇日记
查看>>
uva 387 A Puzzling Problem (回溯)
查看>>
12.2日常
查看>>
12.3日常
查看>>
Delphi 取整函数round、trunc、ceil和floor
查看>>
C/C++二维数组的用法
查看>>
排序 冒泡排序法
查看>>
同步代码时忽略maven项目 target目录
查看>>
MVC.NET:提供对字体文件.woff的访问
查看>>
Informatica_(2)第一个例子
查看>>
string 常用函数
查看>>
RGB色彩的计算机表示
查看>>
iOS地图之MapKit框架
查看>>
2010年过年左右时的艾米果
查看>>
朱元璋
查看>>
Oracle中包的创建
查看>>