洛谷 P1155 【NOIP2008】双栈排序
题目链接
题解
这题有点神啊。。
我们仔细观察一下,发现两个栈内元素必须为降序
那么有结论 如果有\(i < j < k\) 且 \(a[k] < a[i] < a[j]\)则\(i\)和\(j\)不能存在于同一个栈
证明:
因为栈内元素必须降序,
那么加入\(a[j]\)时一定弹出了\(a[i]\),而又因为从小到大排序,
所以\(a[k]\)应该在\(a[i]\)前弹出,故结论正确。
证毕!
因为是两个栈
那么我们可以搞一个二分图染色
最后贪心模拟一遍
Code
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N], s1[N], s2[N], Min[N], t1, t2, ans[N<<1], len, n;
bool G[N][N], vis[N];
int z[N];
void dfs(int x, int c) {
vis[x] = 1; z[x] = c;
for (int i = 1; i <= n; i++) {
if (!G[x][i]) continue;
if (!vis[i])
dfs(i, c^1);
else if (c == z[i]) {
printf("0\n");
exit(0);
}
}
return ;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
Min[n+1] = 2147483647;
for (int i = n; i >= 1; i--)
Min[i] = min(Min[i+1], a[i]);
for (int i = 1; i < n; i++)
for (int j = i+1; j <= n; j++)
if (Min[j+1] < a[i] && a[i] < a[j])
G[i][j] = G[j][i] = 1;
for (int i = 1; i <= n; i++)
if (!vis[i])
dfs(i, 0);
int now = 1;
for (int i = 1; i <= n; i++) {
if (!z[i]) {
while (s1[t1] == now) {
now++;
t1--;
ans[++len] = 1;
}
s1[++t1] = a[i];
len++;
}
else {
while (s1[t1] == now) {
now++;
t1--;
ans[++len] = 1;
}
while (s2[t2] == now) {
now++;
t2--;
ans[++len] = 3;
}
s2[++t2] = a[i];
ans[++len] = 2;
}
}
while (now <= n) {
if (s1[t1] == now) ans[++len] = 1, t1--;
else ans[++len] = 3, t2--;
now++;
}
for (int i = 1; i <= len; i++) printf("%c ", ans[i]+'a');
return 0;
}
洛谷 P1155 【NOIP2008】双栈排序的更多相关文章
- 洛谷 1155 (NOIp2008)双栈排序——仔细分析不合法的条件
题目:https://www.luogu.org/problemnew/show/P1155 这道题教会我们要多思考. 好好分析过后发现同一个栈里不能有升序.就用它写了一个30分. #include& ...
- Luogu1155 NOIP2008 双栈排序 【二分图染色】【模拟】
Luogu1155 NOIP2008 双栈排序 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过 2个栈 S1 和 S2 ,Tom希望借助以下 44 种操作实现将输入序列升序排序. 操作 ...
- NOIP2008双栈排序[二分图染色|栈|DP]
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- noip2008 双栈排序
题目描述 Description \(Tom\)最近在研究一个有趣的排序问题.如图所示,通过\(2\)个栈\(S_1\)和\(S_2\),\(Tom\)希望借助以下\(4\)种操作实现将输入序列升序排 ...
- Noip2008双栈排序
[问题描述] 用两个栈使一个1...n的排列变得有序.一共有四个操作: A.stack1.push() 读入一个放入栈一 B.stack1.pop() 弹出栈一放入输出序列 C.stack2.push ...
- NOIP2008双栈排序(贪心)
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- [题解] [NOIP2008] 双栈排序——关系的冲突至图论解法
Problem 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操 ...
- [NOIP2008]双栈排序 【二分图 + 模拟】
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- [luogu1155 NOIP2008] 双栈排序 (二分图染色)
传送门 Description Input 第一行是一个整数 n . 第二行有 n 个用空格隔开的正整数,构成一个 1−n 的排列. Output 共一行,如果输入的排列不是"可双栈排序排列 ...
- $[NOIp2008]$双栈排序 栈/二分图/贪心
\(Sol\) 先考虑单栈排序,怎么样的序列可以单栈排序呢?设\(a_i\)表示位置\(i\)是哪个数.\(\exist i<j<k\),都没有\(a_k<a_i<a_j\), ...
随机推荐
- ubuntu 12.04 ubuntu System program problem detected 解决方法
1. ubuntu System program problem detected本人操作系统是ubuntu12.04,不知道是系统出了问题还是装的软件有问题,每次开机都出现:System progr ...
- ObjectMapper对象的使用 Object2JSON
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler ...
- SqlServer-truncate && delete && drop 的区别
有些人在删除表的所有记录的时候,喜欢这样来——不给DELETE 语句提供WHERE 子句,表中的所有记录都将被删除.但这种方法是不可取的,正确的应该使用 TRUNCATE TABLE tb_name ...
- Python倒序循环列表(序列)
如果要倒序遍历访问序列中的元素,可以对该序列使用reversed() 函数,reversed函数会生成一份倒序列表的拷贝,但是不会改变原列表.这个函数理解起来很自然,例如 for i in rever ...
- JMS-消息中间件的应用01-基本概念-来自慕课学习-新手学习
什么是JMS? Java消息服务(Java Message Service),即JMS,是一个java平台中关于面向消息中间件的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信. ...
- 7.内网渗透之windows认证机制
文章参考自三好学生域渗透系列文章 看了内网渗透第五篇文章,发现如果想要真正了解PTT,PTH攻击流程,还需要了解windows的认证机制,包括域内的kerberos协议. windows认证机制 在域 ...
- IDEA+DevTools实现热部署功能
开发IDE: Intellij IDEA 2018.1 SpringBoot:1.5.9.RELEASE 热部署 大家都知道在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果, ...
- delphi json用法
用法:uses Superobject, Sperjsondelphi里有json单元. procedure TForm2.SuperObjectClick(Sender: TObject); var ...
- PHP删除目录
function delDir($directory) { if(file_exists($directory)) { $dir_handle = @opendir($directory); if($ ...
- ecliplse里tomcat正常启动后http://localhost:8080/报错404
如下图所示,新建一个工作区间,添加tomcat之后通过ecliplse启动tomcat之后: 访问http://localhost:8080/出现404: 解决方法: 1.确保tomcat里面所有项目 ...