题目背景

这是一道经典的Splay模板题——文艺平衡树。

题目描述

您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1

输入输出格式

输入格式:

第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2, \cdots n-1,n)(1,2,⋯n−1,n) m表示翻转操作次数

接下来m行每行两个数 [l,r][l,r] 数据保证 1 \leq l \leq r \leq n1≤l≤r≤n

输出格式:

输出一行n个数字,表示原始序列经过m次变换后的结果

输入输出样例

输入样例#1:

5 3
1 3
1 3
1 4
输出样例#1:

4 3 2 1 5

说明

n, m \leq 100000n,m≤100000

splay区间翻转每个区间逐层翻转然后合并

当然我们并不需要每次翻转就直接翻到底,而是打一个标记,类似于线段树,在查询的时候在随着查询的深入翻转

#include<cstdio>
#include<iostream>
using namespace std;
#define N 100005
int n,m;
struct node{
int siz,fa,ch[];//0zuo,1you;
bool rev;
}tr[N];
int root;
void push_down(int rt)
{
if(tr[rt].rev)
{
swap(tr[rt].ch[],tr[rt].ch[]);
tr[rt].rev=;
tr[tr[rt].ch[]].rev^=;tr[tr[rt].ch[]].rev^=;
}
}
void pushup(int rt)
{
tr[rt].siz=tr[tr[rt].ch[]].siz+tr[tr[rt].ch[]].siz+;
return;
}
int find(int rt,int x)
{
if(rt==)return ;
push_down(rt);
if(x<=tr[tr[rt].ch[]].siz)return find(tr[rt].ch[],x);
if(x==tr[tr[rt].ch[]].siz+)return rt;
return find(tr[rt].ch[],x-tr[tr[rt].ch[]].siz-);
}
void rotate(int &rt,int x)
{
int y=tr[x].fa,q=tr[y].fa;
bool dy=tr[y].ch[]==x,dz=tr[q].ch[]==y;
push_down(y);
if(rt==y)rt=x,tr[x].fa=q;
else tr[q].ch[dz]=x,tr[x].fa=q;
tr[y].ch[dy]=tr[x].ch[dy^],tr[tr[x].ch[dy^]].fa=y;
tr[x].ch[dy^]=y,tr[y].fa=x;
pushup(y);
return ;
}
void splay(int &rt,int x)
{
push_down(x);
while(rt!=x)
{
int y=tr[x].fa;int q=tr[y].fa;
if(y!=rt)
{
if(tr[y].ch[]==x^tr[q].ch[]==y)rotate(rt,x);
else rotate(rt,y);
}
rotate(rt,x);
}
pushup(x);
return;
}
void print(int rt)
{
if(rt==)return;
push_down(rt);
print(tr[rt].ch[]);
if(rt>&&rt<n+)printf("%d ",rt-);
print(tr[rt].ch[]);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n+;i++)
{
tr[i].siz=n+-i;tr[i].fa=i-;tr[i].ch[]=i+;
}
tr[n+].ch[]=,root=;
while(m--)
{
int l,r;
scanf("%d%d",&l,&r);
splay(root,find(root,l));
splay(tr[root].ch[],find(root,r+));
tr[tr[tr[root].ch[]].ch[]].rev^=;
}
print(root);
return ;
}

文艺平衡树(Splay)的更多相关文章

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

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

  2. luoguP3391[模板]文艺平衡树(Splay) 题解

    链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...

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

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

  4. Tyvj P1729 文艺平衡树 Splay

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

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

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

  6. bzoj3223Tyvj 1729 文艺平衡树 splay

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

  7. bzoj 3223: Tyvj 1729 文艺平衡树 (splay)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面: 3223: Tyvj 1729 文艺平衡树 Time Limit: 10 S ...

  8. bzoj 3223 文艺平衡树 - Splay

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

  9. BZOJ3223 文艺平衡树(splay)

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

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

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

随机推荐

  1. numpy 三个点的使用[...]

    numpy [...]语法简单使用 Python numpy中切片功能与列表切片类似,但功能更加强大 本文主讲numpy中[...]的简单使用,后续工作继续补充. import numpy >& ...

  2. 这一千个Python库,总有你想要的!

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...

  3. CentOS 7 配置OpenCL环境(安装NVIDIA cuda sdk、Cmake、Eclipse CDT)

    序 最近需要在Linux下进行一个OpenCL开发的项目,现将开发环境的配置过程记录如下,方便查阅. 完整的环境配置需要以下几个部分: 安装一个OpenCL实现,基于硬件,选择NVIDIA CUDA ...

  4. 为工程添加上下文菜单(ContextMenu)

    上下文菜单大多数情况下都是为ListView中的Item添加的,长按2S左右跳出菜单,添加上下文菜单必须重写活动中的onCreateContextMenu()方法和onContextItemSelec ...

  5. 栈的push、pop序列 【微软面试100题 第二十九题】

    题目要求: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1是该压栈 ...

  6. webdriver高级应用- 使用日志模块记录测试过程中的信息

    在自动化脚本执行过程中,使用Python的日志模块记录在测试用例执行过程中一些重要信息或者错误日志等,用于监控和后续调试脚本. 在pycharm下新建工程,并创建Log.py.Logger.conf以 ...

  7. python - 接口自动化测试 - contants - 常量封装

    # -*- coding:utf-8 -*- ''' @project: ApiAutoTest @author: Jimmy @file: contants.py @ide: PyCharm Com ...

  8. day04_05 逻辑运算符、表达式

    num += 1 等价于 num = num + 1 逻辑运算符 and   全true则true 条件1 and 条件2 5>3 and 3>2   ===> true 5> ...

  9. [uiautomator篇] 使用uiautomator需要导入uiautomator库

    1 修改依赖文件:build/gradle( 是在app目录下)而不是和app同级目录的build/gradle androidTestCompile 'com.android.support.tes ...

  10. 关于iOS 7的几个开源项目

    MBSwitch   MBSwitch是一个体现了iOS 7扁平化设计风格的UISwitch,支持iOS 7以下系统.允许使用者进行颜色的深度自定义,你可以定义边框的颜色,开/关的颜色以及按钮的颜色. ...