Luogu1155 NOIP2008 双栈排序


题目描述

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



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

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

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

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

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

&lt;a,c,c,b,a,d,d,b&gt;" role="presentation"><a,c,c,b,a,d,d,b><a,c,c,b,a,d,d,b>



当然,这样的操作序列有可能有几个,对于上例 (1,3,2,4),

输入输出格式

输入格式:

第一行是一个整数 n 。

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

输出格式:

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

输入输出样例

输入样例#1:

4
1 3 2 4

输出样例#1:

a b a a b b a b

输入样例#2:

4
2 3 4 1

输出样例#2:

0

输入样例#3:

3
2 3 1

输出样例#3:

a c a b b d

说明

30% 的数据满足: n≤10

50% 的数据满足: n≤50

100% 的数据满足: n≤1000


一开始没看出来是二分图染色,网上好像有方法模拟+贪心过的,ORZ

我们可以发现如果对于k

//yangkai
#include<bits/stdc++.h>
using namespace std;
#define N 1010
int n,a[N],mink[N],col[N],g[N][N];
bool dfs(int x){
for(int i=1;i<=n;i++)
if(g[i][x]){
if(col[i]!=-1){
if(col[x]!=col[i])continue;
return 0;
}
col[i]=1-col[x];
dfs(i);
}
return 1;
}
int main(){
memset(mink,0x3f,sizeof(mink));
memset(col,-1,sizeof(col));
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=n;i>=1;i--)mink[i]=min(mink[i+1],a[i]);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(a[i]<a[j]&&mink[j+1]<a[i])
g[i][j]=g[j][i]=1;
for(int i=1;i<=n;i++)if(col[i]==-1){
col[i]=1;
if(!dfs(i)){
printf("0");
return 0;
}
}
int st=col[1],las=0;
stack<int> p1,p2;
for(int i=1;i<=n;i++){
if(col[i]==st){
while(!p1.empty()&&p1.top()<a[i]){
if(!p2.empty()&&p2.top()<p1.top()){las=p2.top();p2.pop();printf("d ");}
else{las=p1.top();p1.pop();printf("b ");}
}
p1.push(a[i]);
printf("a ");
}else{
while(!p2.empty()&&p2.top()<a[i]){
if(!p1.empty()&&p2.top()>p1.top()){las=p1.top();p1.pop();printf("b ");}
else{las=p2.top();p2.pop();printf("c ");}
}
while(!p1.empty()&&p1.top()==las+1){
las++;
p1.pop();
printf("b ");
}
p2.push(a[i]);
printf("c ");
}
}
while(!p1.empty()&&!p2.empty()){
if(p1.top()<=p2.top()){p1.pop();printf("b ");}
else{p2.pop();printf("d ");}
}
while(!p1.empty()){p1.pop();printf("b ");}
while(!p2.empty()){p2.pop();printf("d ");}
return 0;
}

Luogu1155 NOIP2008 双栈排序 【二分图染色】【模拟】的更多相关文章

  1. [luogu1155 NOIP2008] 双栈排序 (二分图染色)

    传送门 Description Input 第一行是一个整数 n . 第二行有 n 个用空格隔开的正整数,构成一个 1−n 的排列. Output 共一行,如果输入的排列不是"可双栈排序排列 ...

  2. NOIP2008双栈排序[二分图染色|栈|DP]

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

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

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

  4. LOJ P1155 双栈排序 二分图染色 图论

    https://www.luogu.org/problem/show?pid=P1155 题解: https://www.byvoid.com/zhs/blog/noip2008-twostack 开 ...

  5. Luogu1155 NOIP2008双栈排序(并查集)

    两个位置i和j上的元素不能被放进同一个栈的充要条件显然是存在k使i<j<k且ak<ai<aj.由此在保证合法的情况下贪心地放就是正确的了. 至于如何判断,可以记一下后缀最小值, ...

  6. [NOIP2008]双栈排序 【二分图 + 模拟】

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

  7. $[NOIp2008]$双栈排序 栈/二分图/贪心

    \(Sol\) 先考虑单栈排序,怎么样的序列可以单栈排序呢?设\(a_i\)表示位置\(i\)是哪个数.\(\exist i<j<k\),都没有\(a_k<a_i<a_j\), ...

  8. Noip2008双栈排序

    [问题描述] 用两个栈使一个1...n的排列变得有序.一共有四个操作: A.stack1.push() 读入一个放入栈一 B.stack1.pop() 弹出栈一放入输出序列 C.stack2.push ...

  9. [题解] [NOIP2008] 双栈排序——关系的冲突至图论解法

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

随机推荐

  1. 互换CapsLock和Ctrl键

    如果你没有HHKB键盘,完全可以利用系统自身的功能交换CapsLock和Ctrl键. macOS系统 在系统偏好设置里,点击“键盘”,在出现的画面点击右下角的“修饰键...”按钮,在这里可以配置这两个 ...

  2. vue iview组件表格 render函数的使用

    如果要在标签中加入属性,例如img 中src属性 a标签中href属性 此时需要用到 attrs 来加入而不是props { title: '操作', key: 'action', align: 'c ...

  3. day23 CMDB 深入讲解

    课前准备: https://www.getpostman.com/postman 内容: 1. cmdb资产自动更新2. api安全认证3. restfulAPI 4. 自定义用户认证 课堂笔记: 前 ...

  4. Day14 js高级部分

    JS中文学习文档 http://jquery.cuishifeng.cn/ 一.函数变量的作用域: 变量的作用域是在声明时决定的而不是调用执行时决定 作用域链: 二.词法分析: 函数执行前,会进行预编 ...

  5. hdu 6097 Mindis(数学几何,圆心的反演点)

    Mindis Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  6. 在QT中使用静态对象

    最近做教研室的项目,需要只能存在一个接收数据的线程,那么我就想把这个线程设置成一个静态对象.但是在connect信号与槽的时候出了一点问题,最后搞好了,现在这mark一下: 比如说一个声明了一个静态的 ...

  7. jQuery操作dom事件

    参考:jQuery权威指南jQuery初步jQuery选择器jQuery操作domjQuery操作dom事件jQuery插件jQuery操作AjaxjQuery动画与特效jQuery实现导航栏jQue ...

  8. FCT test device

  9. vue中使用jquery插件

    (1)使用npm下载安装依赖 直接npm  install  ‘插件名称’ --save   安装依赖 在main.js中引入插件的样式 在页面中直接使用 (2)直接将js文件引入到项目中 先将js文 ...

  10. GPU编程自学6 —— 函数与变量类型限定符

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...