luoguP3391[模板]文艺平衡树(Splay) 题解
链接一下题目: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) 题解的更多相关文章
- 洛谷.3391.[模板]文艺平衡树(Splay)
题目链接 //注意建树 #include<cstdio> #include<algorithm> const int N=1e5+5; //using std::swap; i ...
- 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay
[阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...
- BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6881 Solved: 4213[Submit][Sta ...
- [洛谷P3391] 文艺平衡树 (Splay模板)
初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...
- BZOJ3223 文艺平衡树(splay)
题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- Tyvj P1729 文艺平衡树 Splay
题目: http://tyvj.cn/p/1729 P1729 文艺平衡树 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 此为平衡树系列第二道:文艺平衡树 ...
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
- 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 ...
随机推荐
- HBase的访问方式
这里只介绍三种最常用的方式 1.HBase shell HBase的命令行工具是最简单的接口,主要用于HBase管理 首先启动HBase 帮助 hbase(main):001:0> help 查 ...
- Java JNA (五)—— 释放Memory对象分配的内存
Java进程的内存包括Java NonHeap空间.Java Heap空间和Native Heap空间. JNA中的Memory对象是从Native Heap中分配空间.但java的GC是针对Java ...
- this与super的区别
调用super()的语句必须要写在子类构造方法的第一行. super()是在子类中调用父类的构造方法:this()是在同一类中调用其它方法. super()和this()都需要放在构造函数的第一行. ...
- opencv windows源码编译
WITH_QT//H:\software\programming\qt\5.12.3\mingw73_32\lib\cmake 5.6的路径要改这样 WITH_OPENGL 编译器mingw32-m ...
- [python 学习] 使用 xml.etree.ElementTree 模块处理 XML
---恢复内容开始--- 导入数据(读文件和读字符串) 本地文件 country_data.xml <?xml version="1.0"?> <data> ...
- pycharm的一个bug,pycharm 在debug时,会运行项目下的所有文件,而不是当前文件
pycharm的一个bug,pycharm 在debug时,会运行项目下的所有文件,而不是当前文件
- 对eventloop的研究
javasctipt是一门单线程的非阻塞的脚本语言,单线程意味着,JavaScript 单线程意味着,javascript代码在执行的任何时候,都只有一个主线程来处理所有的任务. JavaScript ...
- Dubbo学习-6-springboot整合dubbo
1.在前面帖子和工程的基础上,这里使用springboot整合dubbo,首先创建springboot项目: https://start.spring.io/ 进入spring Initializr ...
- dede织梦5.7上传图片302以及Error #2038问题解决
dede织梦5.7上传图片302以及Error #2038问题解决 三月 19, 2012 · Posted in DEDE二次开发, PHP Number of View: 1388 在后台图片集 ...
- php strtr()函数 语法
php strtr()函数 语法 作用:转换字符串中的某些字符直线电机生产厂家 语法:strtr(string,from,to)或者strtr(string,array) 参数: 参数 描述 stri ...