题目描述

给定一个长度为 n 的整数序列,初始时序列为 {1,2,…,n−1,n}。
序列中的位置从左到右依次标号为 1∼n。
我们用 [l,r] 来表示从位置 l 到位置 r 之间(包括两端点)的所有数字构成的子序列。
现在要对该序列进行 m 次操作,每次操作选定一个子序列 [l,r],并将该子序列中的所有数字进行翻转。
例如,对于现有序列 1 3 2 4 6 5 7,如果某次操作选定翻转子序列为 [3,6],那么经过这次操作后序列变为 1 3 5 6 4 2 7。
请你求出经过 m 次操作后的序列。

输入格式

第一行包含两个整数 n,m。
接下来 m 行,每行包含两个整数 l,r,用来描述一次操作。

输出格式

共一行,输出经过 m 次操作后的序列。

数据范围

1≤n,m≤105,
1≤l≤r≤n

输入样例
6 3
2 4
1 5
3 5
输出样例
5 2 1 4 3 6

题目分析

splay的模板题1。

代码如下
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <iomanip>
#define LL long long
#define PII pair<int,int>
using namespace std;
const int N=1e5+5;
struct Node{int s[2],v,p;int size,flag;void init(int _v,int _p){v=_v,p=_p;size=1;}
}tr[N];
int n,m;
int root,idx;
void pushup(int u)          //信息向上合并
{tr[u].size=tr[tr[u].s[0]].size+tr[tr[u].s[1]].size+1;
}
void pushdown(int u)        //下放懒标记
{if(tr[u].flag){swap(tr[u].s[0],tr[u].s[1]);tr[tr[u].s[0]].flag^=1;tr[tr[u].s[1]].flag^=1;tr[u].flag=0;}
}
void rotate(int x)          //旋转操作
{int y=tr[x].p,z=tr[y].p;int k=tr[y].s[1]==x;tr[z].s[tr[z].s[1]==y]=x,tr[x].p=z;tr[y].s[k]=tr[x].s[k^1],tr[tr[x].s[k^1]].p=y;tr[x].s[k^1]=y,tr[y].p=x;pushup(y),pushup(x);
}
void splay(int x,int k)     //把x节点旋转到k节点的下面,如果k为0,则为把x旋转到根
{while(tr[x].p!=k){int y=tr[x].p,z=tr[y].p;if(z!=k)if((tr[y].s[1]==x)^(tr[z].s[1]==y)) rotate(x);else rotate(y);rotate(x);}if(!k) root=x;
}
void insert(int v)          //插入一个节点
{int u=root,p=0;while(u) p=u,u=tr[u].s[v>tr[u].v];u=++idx;if(p) tr[p].s[v>tr[p].v]=u;tr[u].init(v,p);splay(u,0);
}
int get_k(int k)            //得到第k小的节点
{int u=root;while(true){pushdown(u);if(tr[tr[u].s[0]].size>=k) u=tr[u].s[0];else if(tr[tr[u].s[0]].size+1==k) return u;else k-=tr[tr[u].s[0]].size+1,u=tr[u].s[1];}return -1;
}
void print(int u)           //二叉树的中序遍历
{pushdown(u);if(tr[u].s[0]) print(tr[u].s[0]);if(1<=tr[u].v&&tr[u].v<=n) printf("%d ",tr[u].v);if(tr[u].s[1]) print(tr[u].s[1]);
}
int main()
{scanf("%d %d",&n,&m);for(int i=0;i<=n+1;i++) insert(i);          //建树(0和n+1为哨兵)while(m--){int l,r;scanf("%d %d",&l,&r);l=get_k(l),r=get_k(r+2);      //得到第l-1和r+1的节点splay(l,0),splay(r,l);          //把l-1变为根,r+1旋转到l-1的下面tr[tr[r].s[0]].flag^=1;          //那么r+1的左子树即为[l,r]中的数}print(root);return 0;
}

Splay(splay模板)相关推荐

  1. 伸展树 Splay 模板

    学习Splay的时候参考了很多不同的资料,然而参考资料太杂的后果就是模板调出来一直都有问题,尤其是最后发现网上找的各种资料均有不同程度的错误. 好在啃了几天之后终于算是啃下来了. Splay也算是平衡 ...

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

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

  3. 【模板篇】splay(填坑)+模板题(普通平衡树)

    划着划着水一不小心NOIP还考的凑合了- 所以退役的打算要稍微搁置一下了- 要准备准备省选了-. 但是自己已经啥也不会了- 所以只能重新拾起来- 从splay开始吧- splay我以前扔了个板子来着, ...

  4. BZOJ1500 [NOI2005]维修数列(Splay tree)

    [Submit][Status][Discuss] Description 请写一个程序,要求维护一个数列,支持以下 6 种操作: 请注意,格式栏 中的下划线' _ '表示实际输入文件中的空格 Inp ...

  5. poj 3468 Splay 树

    大二上的时候.写过一个AVL的操作演示,今天一看Splay.发现和AVL事实上一样,加上线段树的基础,懒惰标记什么都知道.学起来轻松很多哦 我參考的模板来自这里  http://blog.csdn.n ...

  6. 文艺平衡树(Splay)

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

  7. FHQ大战Splay

    目录 前言 Splay 例题 学习Splay 翻转 splay 求x的排名 求排名为x的数字 前驱后继 插点 删点 代码 区间操作 小结 FHQ Treap 例题 学习FHQ Treap 每个点都有些 ...

  8. 【算法详解】splay的初步了解

    qwq表示最近感受到了不停课的鸭梨啊,好难搞啊--算法太难学了--我好菜啊qwq 其实半个多月前就可以写这篇文章,不过由于时间紧张没写emmmmmm,不扯闲言乱语了,如果有什么写的不好的地方凑活一下吧 ...

  9. [Splay伸展树]splay树入门级教程

    首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角.. 首先引入一下splay的概念,他的中文名是伸展树,意思差不多就是可以随意翻转的二叉树 PS:百度百科中伸展树读作:BoGa ...

最新文章

  1. 腾讯天衍实验室联合微众银行研发医疗联邦学习 AI利器让脑卒中预测准确率达80%
  2. 三角数字(某年南理工研究生入学上机试题)
  3. 在Python中使用正则表达式去掉字符串里的html标签
  4. android 5.0 ios 8,Android 5.0和iOS8.1哪个好?安卓5.0与iOS8.1区别对比
  5. 在linux中查找运行程序句柄,如何查找我的进程在Linux中打开的文件句柄?
  6. 华为弹性云服务器ECS使用学习0
  7. 不缓存调用js的方法
  8. linux笔记 第十七天 加密技术、openssl详解
  9. 20210503:力扣第239周周赛题解
  10. Dubbo使用_尚硅谷视频学习笔记
  11. 使用Windows ADK 创建以U盘引导启动的Windows PE
  12. 开源项目 CDN 加速服务站合集:除了BootCDN,你还知道其他免费的前端开源项目 CDN 加速服务吗
  13. 自动阅读是骗人的吗?新手一定要看,避免入坑
  14. 【案例练习】14—23个Javascript实现的倒数计时器案例
  15. 122.买卖股票的最佳时机 II
  16. 高德导航里的时间是怎么计算的?
  17. 【解决】from win32com.shell import shellcon, shell ImportError: DLL load failed: 找不到指定的程序。
  18. c# 中转服务器,C#.Net 配合小程序实现经过第三方服务器中转文件
  19. 最牛掰得冒泡排序,不接受任何反驳
  20. 听说你的SAP GUI会崩溃闪退?

热门文章

  1. java反转函数_在JAVA中,下列哪个函数可用于字符串的反转?
  2. SetContentView源码解析
  3. 网络安全----数据库1
  4. R语言:感知机模型(一)
  5. Java异常处理流程
  6. element-ui表单下拉选项展示来自数据库的内容
  7. 金融学-风险中性测度
  8. 内存耗用:VSS/RSS/PSS/USS 的介绍
  9. 10.网桥是什么?网桥和路由器及交换机的区别?以太网和令牌环网,nat,查公网ip等
  10. rangeOfString用法