UVA 11922 Permutation Transformer —— splay伸展树
题意:根据m条指令改变排列1 2 3 4 … n ,每条指令(a, b)表示取出第a~b个元素,反转后添加到排列尾部
分析:用一个可分裂合并的序列来表示整个序列,截取一段可以用两次分裂一次合并实现,粘贴到末尾可以用一次合并实现。
翻转可以采用在每个结点上做标记的方法,flip = 1意味着将这棵子树翻转,可以类似线段树用一个pushdown()实现标记向下传递。
可以发现当前排列就是伸展树的中序遍历序列。中序遍历打印结果即可。
注意代码中设置了虚拟首结点0的技巧。
代码如下:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std; struct Node {
Node* ch[];
int r, v, s;
int flip;
Node(int vv): v(vv) {
r = rand();
s = ;
ch[] = ch[] = NULL;
flip = ;
}
bool cmp(const int &x) const {
if(x == v) return -;
return x < v ? : ;
}
void maintain() {
s = ;
if(ch[] != NULL) s += ch[]->s;
if(ch[] != NULL) s += ch[]->s;
}
void pushdown() {
if(flip) {
flip = ;
swap(ch[], ch[]);
if(ch[] != NULL) ch[]->flip = !ch[]->flip;
if(ch[] != NULL) ch[]->flip = !ch[]->flip;
}
}
};
void rotate(Node* &o, int d) {
Node* k = o->ch[d^]; o->ch[d^] = k->ch[d]; k->ch[d] = o;
o->maintain(); k->maintain(); o = k;
}
void insert(Node* &o, int x) {
if(o == NULL) o = new Node(x);
else {
int d = o->cmp(x);
insert(o->ch[d], x);
if(o->ch[d]->r > o->r) rotate(o, d^);
}
o->maintain();
} void splay(Node* &o, int k) {
o->pushdown();
int s = o->ch[] == NULL ? : o->ch[]->s;
int d = k <= s ? : (k == s+ ? - : );
if(d == ) k -= s+;
if(d != -) {
splay(o->ch[d], k);
rotate(o, d^);
}
} Node* merge(Node* left, Node* right) {
splay(left, left->s);
left->ch[] = right;
left->maintain();
return left;
} void split(Node* o, int k , Node* &left, Node* &right) {
splay(o, k);
left = o;
right = o->ch[];
o->ch[] = NULL;
left->maintain();
}
vector<int> seq;
void dfs(Node* o) {
if(o == NULL) return;
o->pushdown();
dfs(o->ch[]);
if(o->v) {
//printf("%d ", o->v);
seq.push_back(o->v);
}
dfs(o->ch[]);
}
int n, m;
int main() {
cin >> n >> m;
Node* root = new Node(); //虚拟首结点0,方便分裂操作
for(int i = ; i <= n; i++) insert(root, i);
while(m--) {
int a, b;
cin >> a >> b;
Node *left, *mid, *right, *o;
split(root, a, left, o);
split(o, b-a+, mid, right);
mid->flip ^= ;
root = merge(merge(left, right), mid);
}
dfs(root);
for(int i = 0; i < seq.size(); i++) cout<<seq[i]<<endl;
return ;
}
UVA 11922 Permutation Transformer —— splay伸展树的更多相关文章
- UVA - 11922 Permutation Transformer (splay)
题目链接 题意:你的任务是根据m条指令改变排列{!,2,3,...,n}.每条指令(a,b)表示取出第a~b个元素,翻转后添加到排列的尾部.输出最终序列. 解法:splay对区间分裂合并翻转,模板题. ...
- UVa 11922 - Permutation Transformer 伸展树
第一棵伸展树,各种调试模板……TVT 对于 1 n 这种查询我处理的不太好,之前序列前后没有添加冗余节点,一直Runtime Error. 后来加上冗余节点之后又出了别的状况,因为多了 0 和 n+1 ...
- UVA 11922 Permutation Transformer(Splay Tree)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18902 [思路] 伸展树+打标记. 用伸展树维护这个序列,使得能 ...
- UVA 11922 Permutation Transformer(平衡二叉树)
Description Write a program to transform the permutation 1, 2, 3,..., n according to m instructions. ...
- uva 11922 Permutation Transforme/splay tree
原题链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18902 伸展树的区间翻转剪切... 如下: #include< ...
- UVA 11922 Permutation Transformer (Splay树)
题意: 给一个序列,是从1~n共n个的自然数,接下来又m个区间,对于每个区间[a,b],从第a个到第b个从序列中分离出来,翻转后接到尾部.输出最后的序列. 思路: 这次添加了Split和Merge两个 ...
- uva 11922 - Permutation Transformer
splay的题: 学习白书上和网上的代码敲的: #include <cstdio> #include <cstring> #include <cstdlib> #i ...
- Splay伸展树学习笔记
Splay伸展树 有篇Splay入门必看文章 —— CSDN链接 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 创造者:Daniel Sleator 和 Robert Ta ...
- 【学时总结】◆学时·VI◆ SPLAY伸展树
◆学时·VI◆ SPLAY伸展树 平衡树之多,学之不尽也…… ◇算法概述 二叉排序树的一种,自动平衡,由 Tarjan 提出并实现.得名于特有的 Splay 操作. Splay操作:将节点u通过单旋. ...
随机推荐
- Spring MVC JSON自己定义类型转换
版权声明:版权归博主全部.转载请带上本文链接.联系方式:abel533@gmail.com https://blog.csdn.net/isea533/article/details/28625071 ...
- passive的作用和原理
passived到底有什么用? passived主要用于优化浏览器页面滚动的性能,让页面滚动更顺滑~~ passived产生的历史时间线 addEventListener():大家都是认识的,为dom ...
- noip考前模板复习
网络流 Dinic(搭配飞行员) //Serene #include<algorithm> #include<iostream> #include<cstring> ...
- Mysql+php报错原因
SQL syntax --语法错误,看near,错误会在near后引号中的内容 的附近 Table/Database....... dosen't existes ---表/库(库名/表名) 不存在 ...
- Mathcad 是一种工程计算软件,主要运算功能:代数运算、线性代数、微积分、符号计算、2D和3D图表、动画、函数、程序编写、逻辑运算、变量与单位的定义和计算等。
Mathcad软件包Mathcad是由MathSoft公司(2006 年4 月被美国PTC收购)推出的一种交互式数值计算系统. Mathcad 是一种工程计算软件,作为工程计算的全球标准,与专有的计算 ...
- 2019-6-23-WPF-网络-request-的-read-方法不会返回
title author date CreateTime categories WPF 网络 request 的 read 方法不会返回 lindexi 2019-06-23 11:26:26 +08 ...
- [Linux]jenkins的安装 标签: linux服务器 2016-08-21 20:47 1060人阅读 评论(23)
现阶段遇到一个问题,因为某台服务器需要腾出来,所以需要将这台服务器上jenkins的主节点重新安装到另外一台服务器上.,下面就介绍一下centos7上面jenkins的安装. 一,步骤 注意:新安装的 ...
- Java练习 SDUT-2618_手机键盘
手机键盘 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 大家应该都见过那种九键的手机键盘,键盘上各字母的分布如下图所示 ...
- day15 web前端之css
css的概念以及初体验 概念: CSS(cascading style sheet)也就是层叠样式表:它是一种网页设计的新技术,现在已经被大多数浏览器所支持,层位网页设计必不可少的工具之一.优点: ...
- spring boot初步
spring boot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程. 该框架使用了特定的方式来进行配置,从而 ...