双栈排序 2008年NOIP全国联赛提高组(二分图染色)
双栈排序
2008年NOIP全国联赛提高组
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希望知道其中字典序最小的操作序列是什么。
输入的第一行是一个整数n。
第二行有n个用空格隔开的正整数,构成一个1~n的排列。
输出共一行,如果输入的排列不是“可双栈排序排列”,输出数字0;否则输出字典序最小的操作序列,每两个操作之间用空格隔开,行尾没有空格。
【样例1】
4
1 3 2 4
【样例2】
4
2 3 4 1
【样例3】
3
2 3 1
【样例1】
a b a a b b a b
【样例2】
0
【样例3】
a c a b b d
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全国联赛提高组(二分图染色)的更多相关文章
- 1169 传纸条 2008年NOIP全国联赛提高组 个人博客:attack.cf
1169 传纸条 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小渊和小轩 ...
- Codevs 1169 传纸条 2008年NOIP全国联赛提高组
1169 传纸条 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小渊和小轩是好朋友也是同班 ...
- 笨小猴 2008年NOIP全国联赛提高组
题目描述 Description 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设m ...
- 火柴棒等式(2008年NOIP全国联赛提高组)
题目描述 Description 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: ...
- Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...
- Codevs 1198 国王游戏 2012年NOIP全国联赛提高组
1198 国王游戏 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 恰逢 H 国国庆,国王邀 ...
- Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对
题目:http://codevs.cn/problem/3286/ 3286 火柴排队 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : ...
- Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组
1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description S 城现有两座监狱,一共 ...
- Codevs 3289 花匠 2013年NOIP全国联赛提高组
3289 花匠 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 花匠栋栋种了一排花,每株花都 ...
随机推荐
- STL map的用法介绍!
map对象的定义 使用前添加map头文件,必须分别指明键和值的类型: map<string,int>word_count; map的构造函数: map<k,v>m; 创建一 ...
- [luoguP1077] 摆花(DP)
传送门 f[i][j] 表示前 i 种花,摆 j 盆的方案数 j f[i][j] = Σ f[i - 1][j] k=max(0, j - a[i]) 博客园这个公式该怎么打啊.. ——代码( ...
- bzoj3545 Peaks 线段树合并
离线乱搞... 也就是一个线段树合并没什么 #include<algorithm> #include<iostream> #include<cstring> #in ...
- Codeforces679C. Bear and Square Grid
n<=500,n*n的01矩阵,可以选择一个k*k的矩阵全变1,求最大1联通区域. 敢敢n^3..模拟k*k的矩阵的位置,从左到右扫的时候,每变一个位置只会引起边界的信息变化,就记含边界的k*k ...
- How many ways?? 矩阵快速幂 邻接矩阵意义
春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线去教室 ...
- Builder设计模式
Builder模式,又称生成器或构建者模式,属于对象创建型模式,侧重于一步一步的构建复杂对象,只有在构建完成后才会返回生成的对象.Builder模式将一个复杂对象的构建与它的表示分离,使得同样的构建过 ...
- dubbo服务的group和version
group 当一个接口有多种实现时,可以用group区分 <!-- dubbo group 使用示例 --> <bean id="demoA" class=&qu ...
- html中布局,让下一个子元素占据剩余的高度
---------------------------------------------------------------------- 原因是: height:100% 引起的, 这句话的意思是 ...
- cakephp2.3.8中何为component
大胆假设,小心求证 记得这句话是以前读高三的时候,一个数学老师(圆头,有点胖胖的老师,不是很记得),经常挂在嘴边的一句话, 对于我们不理解,或者说是无法确定的东西,我们不妨先大胆地去假 ...
- NA路由②
CISCO常见的命令语法: R(c)#ip route network {mask} address/interface : 参数 {}可选项 ...