题目链接

题意:你的任务是根据m条指令改变排列{!,2,3,...,n}。每条指令(a,b)表示取出第a~b个元素,翻转后添加到排列的尾部。输出最终序列。

解法:splay对区间分裂合并翻转,模板题。

初学splay,代码写得有点挫,以后慢慢改~~

 #include<bits/stdc++.h>
using namespace std;
struct Splay {
static const int N=1e5+;
int ch[N][],siz[N],val[N],fa[N],tot,flip[N],n,m;
int rel(int u) {
return ch[fa[u]][]==u;
}
void init() {
tot=fa[]=ch[][]=ch[][]=siz[]=val[]=flip[]=;
}
int newnode(int x) {
int u=++tot;
fa[u]=ch[u][]=ch[u][]=;
siz[u]=,val[u]=x,flip[u]=;
return u;
}
void pu(int u) {
siz[u]=siz[ch[u][]]+siz[ch[u][]]+;
}
void pd(int u) {
if(flip[u]) {
flip[u]=;
swap(ch[u][],ch[u][]);
flip[ch[u][]]^=;
flip[ch[u][]]^=;
}
}
void rot(int u) {
int v=fa[u],f=rel(u),ff=rel(v);
ch[v][f]=ch[u][f^],fa[ch[v][f]]=v;
ch[u][f^]=v,fa[u]=fa[v],fa[v]=u;
if(fa[u])ch[fa[u]][ff]=u;
pu(v),pu(u);
}
void splay(int& rt,int u) {
for(int v=fa[rt]; fa[u]!=v; rot(u))
if(fa[fa[u]]!=v&&rel(fa[u])==rel(u))rot(fa[u]);
rt=u;
}
int kth(int u,int k) {
for(pd(u); k!=siz[ch[u][]]+; pd(u)) {
if(k<siz[ch[u][]]+)u=ch[u][];
else k-=siz[ch[u][]]+,u=ch[u][];
}
return u;
}
int next(int u) {
if(ch[u][]) {
for(u=ch[u][],pd(u); ch[u][]; u=ch[u][],pd(u));
return u;
} else {
for(; fa[u]&&rel(u); u=fa[u]);
return fa[u];
}
}
void split(int& l,int k,int& r) {
splay(l,kth(l,k));
r=ch[l][],fa[l]=fa[r]=ch[l][]=;
pu(l);
}
void merge(int& l,int r) {
splay(l,kth(l,siz[l]));
ch[l][]=r,fa[r]=l;
pu(l);
}
void go() {
init();
scanf("%d%d",&n,&m);
int rt=newnode();
for(int i=; i<=n; ++i)merge(rt,newnode(i));
while(m--) {
int l,r;
scanf("%d%d",&l,&r);
int u,v;
split(rt,l,u);
split(u,r-l+,v);
flip[u]^=;
merge(rt,v);
merge(rt,u);
}
for(int u=next(kth(rt,)); u; u=next(u))printf("%d\n",val[u]);
}
} splay; int main() {
splay.go();
return ;
}

UVA - 11922 Permutation Transformer (splay)的更多相关文章

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

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

  2. UVA 11922 Permutation Transformer(Splay Tree)

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

  3. UVA 11922 Permutation Transformer (Splay树)

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

  4. UVA 11922 Permutation Transformer(平衡二叉树)

    Description Write a program to transform the permutation 1, 2, 3,..., n according to m instructions. ...

  5. uva 11922 Permutation Transforme/splay tree

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

  6. UVa 11922 - Permutation Transformer 伸展树

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

  7. uva 11922 - Permutation Transformer

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

  8. UVA 11922 伸展树Splay 第一题

    上次ZOJ月赛碰到一个题目要求对序列中的某个区间求gcd,并且还要随时对某位数字进行修改 插入 删除,当时马上联想到线段树,但是线段树不支持增删,明显还是不可以的,然后就敲了个链表想暴力一下,结果TL ...

  9. UVA 11922 Splay tree

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

随机推荐

  1. outlook 设置分类收邮件

    打开outlook,工具---->“规则和通知”.建相应的规则即可.

  2. [笔记]如何将传统的回调函数转换为C#5.0支持的await格式

    C#5.0引入了编译器支持的 async 和 await 关键字,这就为开发者提供了使用同步思想写异步代码的方便. 但是有些传统函数仅提供了异步回调实现,如何对其封装,使其可以享受await的便利呢? ...

  3. api响应类

    接口开发响应类封装 class response{ /* * 封通信接口数据 * @param integer $code 状态码 * @param string $message 状态信息 * @p ...

  4. $ python正则表达式系列(1)——正则元字符

    本文主要介绍python中正则表达式的基本用法,做一个初步的认识. 1. 初识 python通过re内置模块来处理正则表达式(regex),底层使用C引擎.一个简单的正则匹配的例子: import r ...

  5. MATLAB画图设置长宽。并高清复制

  6. GZDBHelper

    NuGet:GZDBHelper 初始化: public class APIBase : ApiController { protected GZDBHelper.IDatabase db; publ ...

  7. github资源下载速度慢的解决办法

    xx-net:https://github.com/XX-net/XX-Net

  8. Pro*C基础

    SQL变量的申明: EXEC SQL BEGIN DECLARE SECTION; 类型 变量名[长度] varchar2 serv_number[]; 其中可以定义C变量 EXEC SQL END ...

  9. 【HackerRank】QuickSort(稳定快排,空间复杂度O(n))

    QuickSort In the previous challenge, you wrote a partition method to split an array into 2 sub-array ...

  10. 什么是JavaBeans?

    参看维基百科,归纳出以下几条: JavaBeans是指符合某些标准的类, Bean这个名称用于涵盖这个标准, 其目的在于创建可重用的Java组件. 由于Bean是很“死板”的东西,因此它可以持久存储, ...