链接一下题目: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. 微信小程序之全局储存

    全局变量app.globalData 本地缓存wx.setStorageSync(KEY,DATA)wx.getStorageSync(KEY)wx.getStorageInfoSyncwx.remo ...

  2. HTTP 几种常用的认证机制

    HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RESTful API 使 ...

  3. linux安装 rsync 客户端和相关权限认证

    [root@rsync-client-inotify /]# yum install rsync -y [root@rsync-client-inotify /]# echo "redhat ...

  4. UNIX网络编程总结三

    套接口结构 IPv4套接口地址结构: 1 2 3 4 5 6 7 struct sockaddr_in{/*16字节*/ uint8_t sin_len;  /*结构体长度,8位*/ sa_famil ...

  5. 02tensorflow非线性回归以及分类的简单实用,softmax介绍

    import tensorflow as tf import numpy as np import matplotlib.pyplot as plt # 使用numpy生成200个随机点 x_data ...

  6. linux7 grub配置文件 linux6 grub配置文件

    在 grub 的 kernel 配置后面,添加 acpi_pad.disable=1 重启机器之后,开机就不会自动加载 acpi_pad 模块 一:linux6 [root@node2 ~]# cat ...

  7. bzoj4940 [Ynoi2016]这是我自己的发明 莫队+dfs序

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4940 题解 对于换根操作,处理方法就很套路了. 首先先假定以 \(1\) 为根做一遍 dfs, ...

  8. Oracle数据库一些操作信息

    Oracle数据库如何查看当前用户角色权限及默认表空间查看当前用户的一些信息,包括用户拥有的角色权限信息.用户表空间以及用户和默认表空间的关系等--查看用户的角色权限1.查看当前用户拥有的角色权限信息 ...

  9. 2019 上海网络赛 F Rhyme scheme (字典树DP)

    题目:https://nanti.jisuanke.com/t/41414 题意:求长度为n的第k个bell number  ,  就是第i位的选取范围在 1-(i-1)位的最大值 +1,第一位固定为 ...

  10. Prefix

    Prefix 南昌邀请赛的题,字典树 #include<bits/stdc++.h> using namespace std; typedef long long ll; ll A[]; ...