题目背景

这是一道经典的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 n 1≤l≤r≤n

输出格式:

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

输入样例#1:

5 3

1 3

1 3

1 4

输出样例#1:

4 3 2 1 5

说明

n,m≤100000

我就想水一篇,你要咋地QAQ?
```c++

include<bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 5, L = 0, R = 1;

struct lpl{

int data, size, tag, fa, son[2];

}node[maxn];

int n, m, cnt, root;

namespace Splay{

inline void pushdown(int t)

{

if(!node[t].tag) return; node[t].tag = 0;

swap(node[t].son[L], node[t].son[R]);

node[node[t].son[L]].tag ^= 1; node[node[t].son[R]].tag ^= 1;

}

inline void update(int t){node[t].size = node[node[t].son[L]].size + node[node[t].son[R]].size + 1;}

inline void rotate(int t)
{
int fa = node[t].fa, grdfa = node[fa].fa, which = (node[fa].son[R] == t);
node[grdfa].son[node[grdfa].son[R] == fa] = t; node[t].fa = grdfa;
node[node[t].son[which ^ 1]].fa = fa;
node[fa].son[which] = node[t].son[which ^ 1];
node[t].son[which ^ 1] = fa; node[fa].fa = t;
update(fa); update(t);
} inline void splay(int t, int k)
{
while(node[t].fa != k){
int fa = node[t].fa, grdfa = node[fa].fa;
if(grdfa != k){
if((node[fa].son[R] == t) ^ (node[grdfa].son[R] == fa)) rotate(t);
else rotate(fa);
}
rotate(t);
}
if(!k) root = t;
} inline void insert(int t)
{
int now = root, fa = 0;
while(now){
fa = now;
if(node[now].data < t) now = node[now].son[R];
else now = node[now].son[L];
}
node[fa].son[t > node[fa].data] = ++cnt; node[cnt].data = t;
node[cnt].fa = fa; node[cnt].size = 1;
splay(cnt, 0);
} int Find(int t, int k)
{
pushdown(t);
if(k == node[node[t].son[L]].size + 1) return t;
if(k <= node[node[t].son[L]].size) return Find(node[t].son[L], k);
return Find(node[t].son[R], k - (node[node[t].son[L]].size + 1));
} void print(int t)
{
pushdown(t);
if(node[t].son[L]) print(node[t].son[L]);
if(2 <= node[t].data && node[t].data <= n + 1) printf("%d ", node[t].data - 1);
if(node[t].son[R]) print(node[t].son[R]);
}

}

inline void workk(int l, int r)

{

int LL, RR;

LL = Splay::Find(root, l - 1), RR = Splay::Find(root, r + 1);

Splay::splay(LL, 0);

Splay::splay(RR, LL);

node[node[node[root].son[R]].son[L]].tag ^= 1;

}

int main()

{

scanf("%d%d", &n, &m);

for(int i = 1; i <= n + 2; ++i) Splay::insert(i);

while(m--){

int l, r;

scanf("%d%d", &l, &r); l++; r++;

workk(l, r);

}

Splay::print(root);

return 0;

}

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

  1. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

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

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

  3. [luogu P3391] 文艺平衡树

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

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

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

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

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

  6. Tyvj P1729 文艺平衡树 Splay

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

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

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

  8. BZOJ3223/洛谷P3391 - 文艺平衡树

    BZOJ链接 洛谷链接 题意 模板题啦~2 代码 //文艺平衡树 #include <cstdio> #include <algorithm> using namespace ...

  9. bzoj3223Tyvj 1729 文艺平衡树 splay

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

随机推荐

  1. java Arrays工具类的操作

    package java08; /* java.util.Arrays是一个与数组相关的工具类,里面提供了大量的静态方法,用来实现数组常见的操作 public static String toStri ...

  2. 如何解决拖拽或者缩放、移动中的组件canvas有残留情况

    当我们在做某些需求,如要拖动echarts图表,或者放大缩小 这个时候,有时连续操作,或者在ie或者内存只有8G的电脑上就会出现canvs残留的情况 我们移动的时候,使用的是transform去做的移 ...

  3. phpstorm git配置

    一. 安装git apt-get install git 二. 选择file->setting->Version Control->git 在此输入框输入git的执行路径 三.配置g ...

  4. openlayers学习笔记(十三)— 异步调用JSON数据画点、文字标注与连线

    使用Openlayers 3实现调用本地json数据在地图上添加点.文字标注以及连线. 生成底图地图 首先得有一个地图作为底图,代码如下: let vectorSource = new ol.sour ...

  5. solr测试用的配置

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  6. php strtolower()函数 语法

    php strtolower()函数 语法 作用:把所有字符转换为小写.大理石量具 语法:strtolower(string) 参数: 参数 描述 string 必须,规定要转换的字符串 说明:str ...

  7. set实现数组去重后是对象,这里转化为数组

    ES6中新增了Set数据结构,类似于数组,但是 它的成员都是唯一的 ,其构造函数可以接受一个数组作为参数,如: let array = [1, 1, 1, 1, 2, 3, 4, 4, 5, 3]; ...

  8. [CSP-S模拟测试]:Walk(BFS+建边)

    题目描述 在比特镇一共有$n$个街区,编号依次为$1$到$n$,它们之间通过若干条单向道路连接. 比特镇的交通系统极具特色,除了$m$条单向道路之外,每个街区还有一个编码${val}_i$,不同街区可 ...

  9. 防止NSTimer和调用对象之间的循环引用

    防止NSTimer和调用对象之间的循环引用 @interface NSTimer (EOCBlocksSupport) + (NSTimer *)eoc_scheduledTimerWithTimeI ...

  10. 前端每日实战:29# 视频演示如何不用 transition 和 animation 也能做网页动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/BxbQJj 可交互视频教程 此视频 ...