链接一下题目:luoguP3391[模板]文艺平衡树(Splay)

平衡树解析

这里的Splay维护的显然不再是权值排序

现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶。。。)

那么,继续考虑,其实最终的结果也就是整颗Splay的中序遍历(平衡树的性质诶)

那么,现在如果按照权值来维护显然是不正确的

继续找找规律,发现,如果一个点在序列中的位置为第K个

那么,他就是平衡树的第K大(就当做普通的Splay来看的话)

所以,序列中的位置就变成了区间的第K大点

继续考虑如何翻转

翻转也就是整颗子树的每一个节点的左右儿子交换

因此,只要在根节点的地方打一个标记

在旋转之前下方一下标记就行了

最后输出的时候输出的就是Splay的中序遍历

至于初始的Splay怎么建立,可以直接构造完美的Splay

像我这种比较懒得,直接弄了一个insert。。。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<ctime>
#include<queue>
#include<stack>
#define rg register
#define lst long long
#define N 1000050
using namespace std; int n,m,tot,root;
struct Node{
int ch[];
int v,fa;
int size;
int lazy;
}ljl[N]; inline int read()
{
rg int s=,m=;char ch=getchar();
while(ch!='-'&&(ch<''||ch>''))ch=getchar();
if(ch=='-')m=,ch=getchar();
while(ch>=''&&ch<='')s=(s<<)+(s<<)+ch-'',ch=getchar();
return m?s:-s;
} inline void Pushup(rg int now)
{
ljl[now].size=ljl[ljl[now].ch[]].size+ljl[ljl[now].ch[]].size+;
} inline void Pushdown(rg int now)
{
if(ljl[now].lazy)
{
ljl[ljl[now].ch[]].lazy^=;
ljl[ljl[now].ch[]].lazy^=;
swap(ljl[now].ch[],ljl[now].ch[]);
ljl[now].lazy=;
}
} inline void rotate(rg int x)
{
rg int y=ljl[x].fa,z=ljl[y].fa;
rg int k=ljl[y].ch[]==x;
ljl[z].ch[ljl[z].ch[]==y]=x;
ljl[x].fa=z;
ljl[y].ch[k]=ljl[x].ch[k^];
ljl[ljl[x].ch[k^]].fa=y;
ljl[x].ch[k^]=y;
ljl[y].fa=x;
Pushup(x),Pushup(y);
} inline void splay(rg int x,rg int goal)
{
while(ljl[x].fa!=goal)
{
rg int y=ljl[x].fa,z=ljl[y].fa;
if(z!=goal)(x==ljl[y].ch[])^(y==ljl[z].ch[])?rotate(x):rotate(y);
rotate(x);
}
if(goal==)root=x;
} inline void Insert(rg int x)
{
int now=root,fa=;
while(now)fa=now,now=ljl[now].ch[x>ljl[now].v];
now=++tot;
if(fa)ljl[fa].ch[x>ljl[now].v]=now;
ljl[now].ch[]=ljl[now].ch[]=;
ljl[now].v=x;ljl[now].fa=fa;
ljl[now].size=;
splay(now,);
} inline int Kth(rg int x)
{
rg int now=root;
while()
{
Pushdown(now);
if(x>ljl[ljl[now].ch[]].size+)
x-=ljl[ljl[now].ch[]].size+,now=ljl[now].ch[];
else if(ljl[ljl[now].ch[]].size>=x)now=ljl[now].ch[];
else return now;
}
} inline void Work(rg int le,rg int ri)
{
rg int qq=Kth(le);
rg int hj=Kth(ri+);
splay(qq,),splay(hj,qq);
ljl[ljl[ljl[root].ch[]].ch[]].lazy^=;
} void Write(rg int now)
{
Pushdown(now);
if(ljl[now].ch[])Write(ljl[now].ch[]);
if(ljl[now].v>&&ljl[now].v<n+)printf("%d ",ljl[now].v-);
if(ljl[now].ch[])Write(ljl[now].ch[]);
} int main()
{
n=read(),m=read();
for(rg int i=;i<=n+;++i)Insert(i);
for(rg int i=;i<=m;++i)
{
rg int le=read(),ri=read();
Work(le,ri);
}
Write(root);
return ;
}

luoguP3391[模板]文艺平衡树(Splay) 题解的更多相关文章

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

    题目链接 //注意建树 #include<cstdio> #include<algorithm> const int N=1e5+5; //using std::swap; i ...

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

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

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

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

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

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

  5. BZOJ3223 文艺平衡树(splay)

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

  6. Tyvj P1729 文艺平衡树 Splay

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

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

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

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

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

  9. bzoj3223Tyvj 1729 文艺平衡树 splay

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

随机推荐

  1. HBase的访问方式

    这里只介绍三种最常用的方式 1.HBase shell HBase的命令行工具是最简单的接口,主要用于HBase管理 首先启动HBase 帮助 hbase(main):001:0> help 查 ...

  2. Java JNA (五)—— 释放Memory对象分配的内存

    Java进程的内存包括Java NonHeap空间.Java Heap空间和Native Heap空间. JNA中的Memory对象是从Native Heap中分配空间.但java的GC是针对Java ...

  3. this与super的区别

    调用super()的语句必须要写在子类构造方法的第一行. super()是在子类中调用父类的构造方法:this()是在同一类中调用其它方法. super()和this()都需要放在构造函数的第一行. ...

  4. opencv windows源码编译

    WITH_QT//H:\software\programming\qt\5.12.3\mingw73_32\lib\cmake  5.6的路径要改这样 WITH_OPENGL 编译器mingw32-m ...

  5. [python 学习] 使用 xml.etree.ElementTree 模块处理 XML

    ---恢复内容开始--- 导入数据(读文件和读字符串) 本地文件 country_data.xml <?xml version="1.0"?> <data> ...

  6. pycharm的一个bug,pycharm 在debug时,会运行项目下的所有文件,而不是当前文件

    pycharm的一个bug,pycharm 在debug时,会运行项目下的所有文件,而不是当前文件

  7. 对eventloop的研究

    javasctipt是一门单线程的非阻塞的脚本语言,单线程意味着,JavaScript 单线程意味着,javascript代码在执行的任何时候,都只有一个主线程来处理所有的任务. JavaScript ...

  8. Dubbo学习-6-springboot整合dubbo

    1.在前面帖子和工程的基础上,这里使用springboot整合dubbo,首先创建springboot项目: https://start.spring.io/  进入spring Initializr ...

  9. dede织梦5.7上传图片302以及Error #2038问题解决

    dede织梦5.7上传图片302以及Error #2038问题解决 三月 19, 2012 · Posted in DEDE二次开发, PHP  Number of View: 1388 在后台图片集 ...

  10. php strtr()函数 语法

    php strtr()函数 语法 作用:转换字符串中的某些字符直线电机生产厂家 语法:strtr(string,from,to)或者strtr(string,array) 参数: 参数 描述 stri ...