题目背景

这是一道经典的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. 2018-7-24-WPF-渲染级别

    title author date CreateTime categories WPF 渲染级别 lindexi 2018-07-24 18:46:27 +0800 2018-04-20 16:26: ...

  2. 记一个日志冲突——管中窥豹[java混乱的日志体系]

    D:\Java\jdk1.8.0_211\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Communit ...

  3. bzoj5049 [Lydsy1709月赛]导航系统 双向bfs

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5049 题解 题面里面满眼的随机.既然数据完全随机,那就是在锻炼选手的乱搞能力啊. 根据一个常用 ...

  4. Linux复制命令cp进阶

    cp -a:连同属性和权限也一起复制 cp -i:如果不带该参数,默认覆盖同名文件而不会提醒. cp -u:只拷贝符合以下条件的文件到目标目录:目标目录中不存在的文件或目标目录中文件版本较旧的文件. ...

  5. Testng报错:method-selectors?,parameter*,groups?,packages?,classes?

    以上的报错信息有两种可能的原因: 1.xml的格式确实有误 2.xml的格式正确,但是工程中testng的jar包不止一个,从而导致有歧义或者冲突(这个很可能发生在同一个workspace有多个工程的 ...

  6. leetcode-167周赛-1293-网格中的最短路径

    题目描述: 自己的提交:广度优先 O(mn*min(k,m+n)) class Solution: def shortestPath(self, grid, k: int) -> int: vi ...

  7. java连接远程服务器并执行命令

    导入必要的jar包 <dependency>  <groupId>ch.ethz.ganymed</groupId> <artifactId>ganym ...

  8. 微信小程序中的自定义组件 以及 相关的坑

    Step1 我们初始化一个小程序(本示例基础版本库为 1.7 ),删掉里面的示例代码,并新建一个 components 文件夹,用于存放我们以后开发中的所用组件,今天我们的目的是实现一个 首页 组件, ...

  9. 箭头函数以及this指向问题

    一.定义函数的方式 //1.function const aaa = function () { } //2.对象字面量中定义函数 const obj = { bbb() { } } //3.ES6中 ...

  10. APP开发者如何从应用程序中赚钱?

    付费应用程序,这是应用程序最基本的赚钱方式之一,也是拥有巨大潜力的赚钱方式之一.但有一个问题开发者必须扪心自问,您的程序用户是否有一批粉丝级用户的认可,或对您应用程序品牌的认可   蝉大师APP推广工 ...