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 ...
随机推荐
- java httpclient basic授权
import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpS ...
- JSZip
/*! JSZip - A Javascript class for generating and reading zip files<http://stuartk.com/jszip> ...
- C# 开发 Windows 服务 使用Log4net 组件 不能生成日志文件
使用VS2012开发Windows服务,需要使用Log4net日志组件记录业务情况,但是始终生成不了日志文件. /// <summary> /// 入口方法 /// </summar ...
- LYXF-PE-tools
先随便说一下这个PE-tools有什么用? 我开发这款PE-tools是为了学习而开发的,且是开源的,这里我会提供源码链接.它可以解析windows 32/64位程序中比较常用的一些属性. 里面有个稍 ...
- 对Proxy的研究
概述 Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程. Proxy 可以理解成,在目标对象之前架设一 ...
- B/S上传整个文件夹
在web项目中上传文件夹现在已经成为了一个主流的需求.在OA,或者企业ERP系统中都有类似的需求.上传文件夹并且保留层级结构能够对用户行成很好的引导,用户使用起来也更方便.能够提供更高级的应用支撑. ...
- FastDFS整合nginx模块报错
之前在本地虚拟机用的都是5.1的版本和1.12的nginx,在服务器上尝试一下高版本的6.1 一直报错各种,例如: undeclared (first use in this function) 尝试 ...
- 观察者模式使用WebForm实现的例子
观察者模式是一种可以描述一对多对象依赖关系的行为模式.当一个对象状态发生变化时,依赖它的其它对象会自动被更新状态.下面这个图展示了观察者模式的层级: 举个例子吧,我们某个报表界面现在有个dashboa ...
- Solr索引数据
一般来说,索引是系统地排列文档或(其他实体).索引使用户能够在文档中快速地查找信息. 索引集合,解析和存储文档. 索引是为了在查找所需文档时提高搜索查询的速度和性能. 在Apache Solr中的索引 ...
- 20150803--JS学习笔记(1)
JS中对象的 prototype 的含义: javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用. A.pro ...