双栈排序

2008年NOIP全国联赛提高组

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 大师 Master
 
 
题目描述 Description

Tom最近在研究一个有趣的排序问题。如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序。

操作a

如果输入序列不为空,将第一个元素压入栈S1

操作b

如果栈S1不为空,将S1栈顶元素弹出至输出序列

操作c

如果输入序列不为空,将第一个元素压入栈S2

操作d

如果栈S2不为空,将S2栈顶元素弹出至输出序列

如果一个1~n的排列P可以通过一系列操作使得输出序列为1,2,…,(n-1),n,Tom就称P是一个“可双栈排序排列”。例如(1,3,2,4)就是一个“可双栈排序序列”,而(2,3,4,1)不是。下图描述了一个将(1,3,2,4)排序的操作序列:<a,c,c,b,a,d,d,b>

当然,这样的操作序列有可能有几个,对于上例(1,3,2,4),<a,c,c,b,a,d,d,b>是另外一个可行的操作序列。Tom希望知道其中字典序最小的操作序列是什么。

输入描述 Input Description

输入的第一行是一个整数n。

第二行有n个用空格隔开的正整数,构成一个1~n的排列。

输出描述 Output Description

输出共一行,如果输入的排列不是“可双栈排序排列”,输出数字0;否则输出字典序最小的操作序列,每两个操作之间用空格隔开,行尾没有空格。

样例输入 Sample Input

【样例1】

4

1 3 2 4

【样例2】

4

2 3 4 1

【样例3】

3

2 3 1

样例输出 Sample Output

【样例1】

a b a a b b a b

【样例2】

0

【样例3】

a c a b b d

数据范围及提示 Data Size & Hint

30%的数据满足: n<=10

50%的数据满足: n<=50

100%的数据满足: n<=1000

/*
若不能双栈排序,一定存在冲突
把冲突连边,因为只有两个栈,判断可否二分图染色即可
考虑冲突。若有i<j<k a[k]<a[i]<a[j] 则一定不能单栈排序
若i<j<k<x 有a[x]<a[i]<a[j]<a[k]则一定不能双栈排序
预处理后缀最小值,把冲突连边即可。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<queue>
#include<stack> #define N 1007
#define inf 0x3f3f3f3f
#define B 1 using namespace std;
int n,ans,cnt;
int a[N],f[N],col[N],head[N];
stack<int>s1,s2;
struct edge{
int u,v,net;
}e[N<<]; inline void add(int u,int v)
{
e[++cnt].v=v;e[cnt].net=head[u];head[u]=cnt;
} inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void bfs(int u)
{
queue<int>q;q.push(u);col[u]=B;
while(!q.empty())
{
int now=q.front();q.pop();
for(int i=head[now];i;i=e[i].net)
{
int v=e[i].v;
if(col[v]==-) col[v]=col[now]^,q.push(v);
else if(col[v]!=(col[now]^)){printf("0\n");exit();}
}
}
} int main()
{
memset(col,-,sizeof col);
n=read();
for(int i=;i<=n;i++) a[i]=read();
f[n+]=inf;
for(int i=n;i>=;i--) f[i]=min(f[i+],a[i]);
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
if(a[i]>f[j+] && a[i]<a[j]) add(i,j),add(j,i); for(int i=;i<=n;i++)
if(col[i]==-) bfs(i);
cnt=;
for(int i=;i<=n;i++)
{
if(col[i]==B) s1.push(a[i]),printf("a ");
else s2.push(a[i]),printf("c ");
while((!s1.empty() && s1.top()==cnt) || (!s2.empty() && s2.top()==cnt))
{
if(!s1.empty() && s1.top()==cnt) s1.pop(),printf("b ");
else s2.pop(),printf("d ");
++cnt;
}
}
return ;
}

双栈排序 2008年NOIP全国联赛提高组(二分图染色)的更多相关文章

  1. 1169 传纸条 2008年NOIP全国联赛提高组 个人博客:attack.cf

    1169 传纸条 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond         题目描述 Description 小渊和小轩 ...

  2. Codevs 1169 传纸条 2008年NOIP全国联赛提高组

    1169 传纸条 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小渊和小轩是好朋友也是同班 ...

  3. 笨小猴 2008年NOIP全国联赛提高组

    题目描述 Description 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设m ...

  4. 火柴棒等式(2008年NOIP全国联赛提高组)

    题目描述 Description 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: ...

  5. Codevs 1218 疫情控制 2012年NOIP全国联赛提高组

    1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...

  6. Codevs 1198 国王游戏 2012年NOIP全国联赛提高组

    1198 国王游戏 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 恰逢 H 国国庆,国王邀 ...

  7. Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对

    题目:http://codevs.cn/problem/3286/ 3286 火柴排队  2013年NOIP全国联赛提高组  时间限制: 1 s   空间限制: 128000 KB   题目等级 : ...

  8. Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组

    1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description S 城现有两座监狱,一共 ...

  9. Codevs 3289 花匠 2013年NOIP全国联赛提高组

    3289 花匠 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 花匠栋栋种了一排花,每株花都 ...

随机推荐

  1. python接口测试之Http请求(三)

    python的强大之处在于提供了很多的标准库,这些标准库可以直接调用,本节部分,重点学习和总结在 接口测试中Python的Http请求的库的学习. 首先来看httplib,官方的解释为:本模块定义了类 ...

  2. AndroidSweetSheet:ViewPager的实现(2)

     AndroidSweetSheet:ViewPager的实现(2) 附录文章9说明了AndroidSweetSheet典型的列表样式实现,本文写一个例子,说明AndroidSweetSheet以 ...

  3. 在win10配置环境变量

    从win7升级成win10后找不到在哪配置环境变量...手动再见ヾ( ̄▽ ̄)Bye~,废话不多说,下面开始图文模式: 1)打开文件资源管理器,点左上角的"计算机"

  4. POJ1308/HDU1325/NYOJ129-Is It A Tree?,并查集!

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28838   Accepted: 9843 -& ...

  5. [luoguP1074] 靶形数独(搜索)

    传送门 75分,太菜,不会优化了,吐了. 几点优化. 1.先搜索容易确定的位置 2.从中心往周围搜 3.枚举数字的时候倒序枚举 4.如果没有枚举到的数字都是最优情况的话也不能比当前ans大就剪枝 5. ...

  6. SharedPreferences保存用户偏好参数

    package com.example.administrator.myapplication; import android.content.Context; import android.cont ...

  7. P1160 队列安排 洛谷

    https://www.luogu.org/problem/show?pid=1160 题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进 ...

  8. MongoDB小结25 - 复合唯一索引

    只要满足索引的其中之一不同即可 db.blog.ensureIndex({"username":1,"blogname":1}) 作者和作品名其中之一不同即可创 ...

  9. html中布局,让下一个子元素占据剩余的高度

    ---------------------------------------------------------------------- 原因是: height:100% 引起的, 这句话的意思是 ...

  10. go-import下划线的作用

    原文:http://studygolang.com/articles/4356 ------------------------------------------------------------ ...