链接一下题目: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. python 数据分析 Numpy(Numerical Python Basic)

    a = np.random.random((2,4)) a Out[5]: array([[0.20974732, 0.73822026, 0.82760722, 0.050551 ], [0.773 ...

  2. linux查看 rsync 服务状态

    [root@rsync-server-1 /]# lsof -i tcp:873 COMMAND  PID USER  FD  TYPE DEVICE SIZE/OFF NODE NAME rsync ...

  3. 动态规划—distinct-subsequences

    题目: Given a string S and a string T, count the number of distinct subsequences of T in S. A subseque ...

  4. fiddler使用介绍

    Fiddler的详细介绍 Fiddler的详细介绍 一.Fiddler与其他抓包工具的区别 1.Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大.模拟http请求的功能也不够, ...

  5. VS2017 IDE 说明

  6. python内建模块——collections模块

    在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict.namedtuple和Ord ...

  7. [CF846D]Monitor题解

    看了一眼这题所用的操作,我觉得二维树状数组珂做,然后发现如果按时间顺序把节点一个个加进去再判会TLE,但发现二分时间明显比刚刚的做法快,于是二分时间+暴力插入该时间之内的点+树状数组维护即可AC 贴个 ...

  8. python读取数据

    #读取一行数据,去掉头尾空格 line = sys.stdin.readline().strip() #line类型为字符串 #字符串变成列表 line = sys.stdin.readline(). ...

  9. 【HDOJ6628】permutation 1(dfs)

    题意:求1到n的排列中使得其差分序列的字典序为第k大的原排列 n<=20,k<=1e4 思路:爆搜差分序列,dfs时候用上界和下界剪枝 #include<bits/stdc++.h& ...

  10. .Net服务组件(ServicedComponent)简介及其使用

    .NET Enterprise Services 为企业应用程序提供重要的基础结构.COM+ 为企业环境中部署的组件编程模型提供服务结构.System.EnterpriseServices命名空间向 ...