https://www.luogu.org/problem/show?pid=1155

题目描述

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希望知道其中字典序最小的操作序列是什么。

输入输出格式

输入格式:

输入文件twostack.in的第一行是一个整数n。

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

输出格式:

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

输入输出样例

输入样例#1:

【输入样例1】
4
1 3 2 4
【输入样例2】
4
2 3 4 1
【输入样例3】
3
2 3 1

输出样例#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

如果两个数a[i]、a[j]不能放到同一个栈里,那么存在i<j<k,a[k]<a[i]<a[j]

所以可以枚举i,j,k,将不能放在一起的a[i]、a[j]连边,看最后能否称为一个二分图

枚举i,j,k ,O(n³),采用后缀优化

f[i]表示i以后的数的最小值

枚举i,j,判断a[i]<a[j]&&f[j]<a[i]

#include<stack>
#include<cstdio>
#include<algorithm>
#define N 1001
using namespace std;
int n,a[N],f[N];
int front[N*N],nxt[N*N],to[N*N],tot;
int col[N];
stack<int>s1,s2;
void add(int u,int v)
{to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;
}
bool dfs(int now,int c)
{col[now]=c;for(int i=front[now];i;i=nxt[i]){if(col[to[i]] && col[to[i]]==col[now]) return false;else if(!col[to[i]] && !dfs(to[i],c^1)) return false; }return true;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);f[n]=10001;for(int i=n-1;i;i--) f[i]=min(f[i+1],a[i+1]);for(int i=1;i<n;i++)for(int j=i+1;j<=n;j++)if(a[i]<a[j] && f[j]<a[i]) add(a[i],a[j]); for(int i=1;i<=n;i++)if(!col[a[i]]) if(!dfs(a[i],2)) { printf("0"); return 0; }int x=1;for(int i=1;i<=n;i++){if(col[a[i]]==2) printf("a "),s1.push(a[i]);else printf("c "),s2.push(a[i]);while((!s1.empty()&&s1.top()==x) || (!s2.empty()&&s2.top()==x)){if(!s1.empty()&&s1.top()==x) { printf("b "); s1.pop(); }else { printf("d "); s2.pop(); }x++; }}
} 

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/7275641.html

NOIP2008 双栈排序相关推荐

  1. [NOIp2008] 双栈排序 (二分图染色 + 贪心)

    题意 给你一个长为 \(n\) 的序列 \(p\) ,问是否能够通过对于两个栈进行 push, pop(print) 操作使得最后输出序列单调递增(即为 \(1 \cdots n\) ),如果无解输出 ...

  2. #include NOIP2008 Junior 双栈排序 ——using namespace wxl;

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  3. #include lt;NOIP2008 Juniorgt; 双栈排序 ——using namespace wxl;

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  4. P1155 双栈排序(二分图的染色判断+链式前向星)

    P1155 双栈排序 让字典序最小,当然尽量进S1 那什么时候必须进S2呢? a[i]和a[j] 不能压入同一个栈⇔存在一个k,使得i<j<k且a[k]<a[i]<a[j] 因 ...

  5. P1155 双栈排序(二分图染色)

    P1155 双栈排序(二分图染色) 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一 ...

  6. AC日记——双栈排序 洛谷 P1155

    双栈排序 思路: 二分图染+模拟: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 #define ...

  7. 【每日一题】8月7日题目精讲—双栈排序

    来源:牛客网 文章目录 题目描述 题意: 题解: 代码: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %l ...

  8. [大牛就是牛]双栈排序

    [题目描述] Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈 ...

  9. P1155 双栈排序

    P1155 双栈排序 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S ...

最新文章

  1. Bootstrap:关于bootstrap单页面中多Modal的问题
  2. java反射之-性能优化
  3. 多线程put后可能导致get死循环
  4. SpringBoot使用Redis和MyBatis完成缓存数据的增删改查
  5. ASP.NET下MVC设计模式的实现
  6. MyEclipse10的正确破解方法
  7. ajax格式,需要指定交互的data类型
  8. WebBrowser部分用法
  9. 2.图像作为函数 | 噪音概念、图像相减_7
  10. 威马汽车否认接盘ST众泰:没有任何兴趣参与
  11. python定义常量
  12. 移动端点击一下显示再点一下消失_App用户自然流量裂变增长:移动互联网社交+深度链接技术的应用!...
  13. 引用 孙悟空的师傅菩提祖师的真实真份和镇元大仙辈份排名+四大灵猴
  14. 陕西省土地规划资质办理流程及申请条件
  15. Keil的安装及使用
  16. 计算机说课比赛稿,《从军行》说课比赛稿
  17. 风语者---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十九)
  18. 上海财经大学浙江学院计算机应用,【招生季⑦】今晚带你走进上海财经大学浙江学院——经济与信息管理系...
  19. 锂电池OCV曲线拟合python实现
  20. html中如何给图片设置浮动,css – 如何在div中浮动图像

热门文章

  1. 在.net 中依据页的角色验证方式产生相匹配的菜单
  2. python怎么把所有标点符号置空_Python从小白到攻城狮(1)——python环境搭建
  3. 基于Javaweb的订餐管理系统的介绍和分析
  4. 声学漫谈之四:A加权(A-weighted)到底是什么?
  5. sharepoint文件夹本地同步_Windows平台下使用 Rclone 挂载 OneDrive 为本地硬盘
  6. 计算机应用基础第九章在线测试答案,郑大计算机应用基础第9章节在线测试答案...
  7. 几种常见的用于拟合的分布
  8. Python-OpenCV 笔记6 -- 轮廓(Contours)
  9. python3的3D开发-基于blender(2)
  10. c++17(23)-typedef