Description

Write a program to transform the permutation 1, 2, 3,..., n according to m instructions. Each instruction (a, b) means to take out the subsequence from the a-th to the b-th element, reverse it, then append it to the end.

Input

There is only one case for this problem. The first line contains two integers n and m ( 1n, m100, 000). Each of the next m lines contains an instruction consisting of two integers a and b ( 1abn).

Output

Print n lines, one for each integer, the final permutation.

Explanation of the sample below

Instruction (2,5): Take out the subsequence {2,3,4,5}, reverse it to {5,4,3,2}, append it to the remaining permutation {1,6,7,8,9,10}

Instruction (4,8): The subsequence from the 4-th to the 8-th element of {1,6,7,8,9,10,5,4,3,2} is {8,9,10,5,4}. Take it out, reverse it, and you'll get the sample output.

题目大意:有一个1~n的序列,每次取出序列中第a~b的序列,翻转后排在序列的最后,求最后形成的序列

思路:用伸展树维护,先把1~a-1分裂出来,再把a~b分裂出来,翻转,然后接在最后。至于怎么翻转,标记一下就可以了。

PS:标记完翻转之后我脑子抽了一下每次都把标记传到最下面结果毫无疑问是TLE了……

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int MAXN = ; int child[MAXN][], fa[MAXN], size[MAXN];
bool flip[MAXN]; inline void update(int &x) {
size[x] = size[child[x][]] + size[child[x][]] + ;
} inline void pushdown(int &x) {
if(flip[x]) {
flip[x] = ;
swap(child[x][], child[x][]);
flip[child[x][]] ^= ;
flip[child[x][]] ^= ;
}
} inline void rotate(int &x, int t) {
int y = child[x][t];
child[x][t] = child[y][t ^ ];
child[y][t ^ ] = x;
update(x); update(y);
x = y;
} //rotate the kth to root
void splay(int &x, int k) {
pushdown(x);
if(k == size[child[x][]] + ) return ;
int t = (k > size[child[x][]] ? : );
if(t == ) k -= (size[child[x][]] + );
int p = child[x][t];
pushdown(p);
int t2 = (k > size[child[p][]] ? : );
int k2 = (t2 == ? k : k - size[child[p][]] - );
if(k != size[child[p][]] + ) {
splay(child[p][t2], k2);
if(t == t2) rotate(x, t);
else rotate(child[x][t], t ^ );
}
rotate(x, t);
}
//left cannot be null
inline int merge(int left, int right) {
splay(left, size[left]);
child[left][] = right;
update(left);
return left;
} inline void split(int x, int k, int &left, int &right) {
splay(x, k);
left = x;
right = child[x][];
child[x][] = ;
update(left);
} void print(int x) {
if(x == ) return ;
pushdown(x);
print(child[x][]);
if(x != ) printf("%d\n", x - );
print(child[x][]);
} int cnt; int build(int l, int r) {
if(l > r) return ;
int mid = (l + r) >> ;
child[mid][] = build(l, mid - );
child[mid][] = build(mid + , r);
update(mid);
return mid;
} int root; int main() {
int n, m, a, b;
scanf("%d%d", &n, &m);
root = build(, n + );
while(m--) {
scanf("%d%d", &a, &b);
int left, mid, right, x;
split(root, a, left, x);
split(x, b - a + , mid, right);
flip[mid] ^= ;
root = merge(merge(left, right), mid);
//print(root); system("pause");
}
print(root);
}

UVA 11922 Permutation Transformer(平衡二叉树)的更多相关文章

  1. UVa 11922 - Permutation Transformer 伸展树

    第一棵伸展树,各种调试模板……TVT 对于 1 n 这种查询我处理的不太好,之前序列前后没有添加冗余节点,一直Runtime Error. 后来加上冗余节点之后又出了别的状况,因为多了 0 和 n+1 ...

  2. uva 11922 - Permutation Transformer

    splay的题: 学习白书上和网上的代码敲的: #include <cstdio> #include <cstring> #include <cstdlib> #i ...

  3. UVA 11922 Permutation Transformer(Splay Tree)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18902 [思路] 伸展树+打标记. 用伸展树维护这个序列,使得能 ...

  4. UVA - 11922 Permutation Transformer (splay)

    题目链接 题意:你的任务是根据m条指令改变排列{!,2,3,...,n}.每条指令(a,b)表示取出第a~b个元素,翻转后添加到排列的尾部.输出最终序列. 解法:splay对区间分裂合并翻转,模板题. ...

  5. UVA 11922 Permutation Transformer (Splay树)

    题意: 给一个序列,是从1~n共n个的自然数,接下来又m个区间,对于每个区间[a,b],从第a个到第b个从序列中分离出来,翻转后接到尾部.输出最后的序列. 思路: 这次添加了Split和Merge两个 ...

  6. UVA 11922 Permutation Transformer —— splay伸展树

    题意:根据m条指令改变排列1 2 3 4 … n ,每条指令(a, b)表示取出第a~b个元素,反转后添加到排列尾部 分析:用一个可分裂合并的序列来表示整个序列,截取一段可以用两次分裂一次合并实现,粘 ...

  7. uva 11922 Permutation Transforme/splay tree

    原题链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18902 伸展树的区间翻转剪切... 如下: #include< ...

  8. UVA 11922 Splay tree

    UVA 11922 题意: 有n个数1~n 操作a,b表示取出第a~b个数,翻转后添加到数列的尾部 输入n,m 输入m条指令a,b 输出最终的序列 代码: #include<iostream&g ...

  9. UVA 12003 Array Transformer

    Array Transformer Time Limit: 5000ms Memory Limit: 131072KB This problem will be judged on UVA. Orig ...

随机推荐

  1. python 输入一个整数,判断其是否既是3的倍数,又是5的倍数

    v = int(input('请输入一个整数:')) if v % 3 == 0 and v % 5 ==0: print(v,'即是3的倍数又是5的倍数') else: print('不是3或5的倍 ...

  2. 一站式学习Redis 从入门到高可用分布式实践

    1:redis 是用c语言来实现的,速度快 持久化 单线程 复杂的数据类型有bitmap和hyperloglog和geo地理信息2:高可用.分布式 v2.8开始支持Redis-Sentinel(哨兵) ...

  3. TCP/IP初识(一)

    TCP/IP学习记录,如有错误请指正,谢谢!!! 什么是TCP/IP协议? TCP/IP协议族分为四层(另一个名字是Internet协议族(Internet Protocol Suite)):链路层. ...

  4. c和c++单链表

    c++版 #include<iostream> #include<malloc.h> using namespace std; struct node{ int data; n ...

  5. Linux下Git远程仓库的使用详解

    Git远程仓库Github 提示:Github网站作为远程代码仓库时的操作和本地代码仓库一样的,只是仓库位置不同而已! 准备Git源代码仓库 https://github.com/ 准备经理的文件 D ...

  6. Linux系统结构 详解(转)

    Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统.部分层次结构如图1-1所 ...

  7. Python Monitoring UPS with SNMPWALK

    ##Background My co-worker told me he needed to monitor UPS with SNMP module but he only can get hexa ...

  8. Java OOP——第六章 框架集合

    1.集合框架包含的主要内容及彼此之间的关系: 图1:   集合框架:是为了表示和操作集合而统一规定的一种统一的标准体系结构.               包含三大块的内容:对外的接口.接口的是实现和对 ...

  9. iOS 打包常见问题处理

    Cannot proceed with delivery: an existing transporter instance is currently uploading this package 原 ...

  10. BIOS简单讲解

    学习链接: http://www.xuetangx.com/courses/course-v1:TsinghuaX+30240243X+sp/courseware/1d95cdf6f0e9434488 ...