vijos 1605 双栈排序 - 贪心 - 二分图
不能发现两个数$a_{j}, a_{k}\ \ (j < k)$不能放在同一个栈的充分必要条件时存在一个$i$使得$j < k < i$且$a_{i} < a_{j} < a_{k}$。
证明?写个dfs就证完了(就是考虑任意一个三元组)。
然后可建图,对于满足上面条件的$(j, k)$,$j$和$k$连一条无向边。
显然必要条件时图不存在奇环,即能够二分染色。
再证明一下这是必要条件。
我们先构造一个做法:硬点二分染色完白点扔第一个栈里,黑点扔第二个栈里,当当前需要输出的数能够输出的时候就输出,否则继续加数。
我们只需要证明每个数都能被正确的输出就行了。
显然第1个数一定能被正确地输出。
假设前$k - 1\ \ \ (k > 1)$个数已经被正确地输出了,考虑第$k$个数。
- 第$k$个数不在栈中,那么还剩在序列中,我们把之间的数加入栈中,再把它加入弹出,它就正确地输出了。
- 第$k$个数在栈中
- 某个栈的栈顶,直接弹出,正确地输出了。
- 否则它上面一定存在一个数$x > k$使得它无法弹出。
- 如果$1, 2, \dots, k - 1$中都在$k$之前,那么输出完前$k - 1$个数后,$k$入栈后就可以弹出并输出了,与做法矛盾。
- 否则存在一个$y < x$在$k$之后,由建图方法和染色可知$k, x$不能在同一个栈中,矛盾。
因此图能够二分染色是存在解的充分必要条件。
然后拿个栈直接贪心就好了。每次选择能够进行的字典序最小的操作。
Code
/**
* Vijos
* Problem#1605
* Accepted
* Time: 42ms
* Memory: 1.363m
*/
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
typedef bool boolean; const int N = 1e3 + ; int n;
int ar[N];
int mns[N];
boolean g[N][N]; inline void init() {
scanf("%d", &n);
for (int i = ; i <= n; i++)
scanf("%d", ar + i);
} int col[N];
boolean color(int p, int col) {
if (::col[p] != -)
return ::col[p] == col;
::col[p] = col;
for (int i = ; i <= n; i++)
if (g[p][i] && !color(i, col ^ ))
return false;
return true;
} int s1[N], s2[N];
int tp1, tp2; inline void solve() {
mns[n] = ar[n];
for (int i = n - ; i; i--)
mns[i] = min(mns[i + ], ar[i]);
for (int i = ; i < n; i++)
for (int j = i + ; j < n; j++)
if (ar[i] < ar[j] && mns[j] < ar[i])
g[i][j] = g[j][i] = true;
memset(col, -, sizeof(col));
for (int i = ; i <= n; i++)
if (col[i] == - && !color(i, )) {
puts("");
return;
} int cur = , p = ;
while (cur <= n) {
if (p <= n && !col[p] && s1[tp1] != cur)
putchar('a'), s1[++tp1] = ar[p++];
else if (s1[tp1] == cur)
putchar('b'), tp1--, cur++;
else if (p <= n && col[p] && s2[tp2] != cur)
putchar('c'), s2[++tp2] = ar[p++];
else
putchar('d'), tp2--, cur++;
putchar(' ');
}
} int main() {
init();
solve();
return ;
}
vijos 1605 双栈排序 - 贪心 - 二分图的更多相关文章
- 洛谷$P1155$ 双栈排序 贪心+二分图匹配
正解:贪心+二分图匹配 解题报告: 传送门$QwQ$ 跪了,,,我本来以为我$NOIp$做得差不多了,,,然后康了一眼发现没做多少啊其实$QAQ$ 然后来康题趴$QwQ$ 首先考虑如果只有一个栈的情况 ...
- P1155 双栈排序(二分图染色)
P1155 双栈排序(二分图染色) 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一 ...
- [NOIP2008]双栈排序 【二分图 + 模拟】
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- Luogu1155 NOIP2008 双栈排序 【二分图染色】【模拟】
Luogu1155 NOIP2008 双栈排序 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过 2个栈 S1 和 S2 ,Tom希望借助以下 44 种操作实现将输入序列升序排序. 操作 ...
- [LuoguP1155]双栈排序_二分图_bfs
双栈排序 题目链接:https://www.luogu.org/problem/P1155 数据范围:略. 题解: 神仙题. 就第一步就够劝退了. 这个二分图非常不容易,首先只有两个栈,不是属于一个就 ...
- 洛谷P1155 双栈排序(贪心)
题意 题目链接 Sol 首先不难想到一种贪心策略:能弹则弹,优先放A 然后xjb写了写发现只有\(40\),原因是存在需要决策的情况 比如 \(A = {10}\) \(B = {8}\) 现在进来一 ...
- 【Luogu】P1155双栈排序(二分图)
题目链接在此 此题一开始写了个深搜,过了30%的数据,也就是n<=10的那一段.... 然后看了题解发现这是个二分图的判断. 我们先举例子找到不能放进一个栈里的规律.设有数列[2,3,1,4] ...
- $[NOIp2008]$双栈排序 栈/二分图/贪心
\(Sol\) 先考虑单栈排序,怎么样的序列可以单栈排序呢?设\(a_i\)表示位置\(i\)是哪个数.\(\exist i<j<k\),都没有\(a_k<a_i<a_j\), ...
- 双栈排序(洛谷P1155)二分图的判定+思维贪心
题目:戳这里 题目大意: 给你一个数列,问能否通过两个栈的push与pop把它输出成一个升序序列(每个数只能入队并出队一次) 不能的话输出0,能的话输出操作方法 主要思路: 1.判断是否可以成功输出升 ...
随机推荐
- postgresql免密码登录
https://www.postgresql.org/docs/8.3/static/libpq-pgpass.html vi ~/.pgpass 输入以下内容 hostname:port:datab ...
- Nest.js WebSocket
Docs: https://docs.nestjs.com/websockets/gateways λ yarn add @nestjs/websockets λ nest g ga events e ...
- Windows 环境下 wampserver 与 phpStudy 的环境配置
一. wamperserver 1.下载好安装到本地指定目录,官网下载地址 http://www.wampserver.com 2.根据自己实际的安装路径,D:\pc\wampserver\wamp ...
- mac重启,开启apache时报错~~~镜像没有找到
mac重启apache时,报类似下面的错 dyld: Library not loaded: /usr/local/lib/libjpeg8.dylib Referenced from: /usr/l ...
- itoa()函数
itoa()函数 itoa():char *itoa( int value, char *string,int radix); 原型说明: value:欲转换的数据.string:目标字符串的地址.r ...
- jQuery实现限制input框 textarea文本框输入字符数量的方法
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 浅谈Vue.use
我们先来看一个简单的事例首先我使用官方脚手架新建一个项目vue init webpack vue-demo然后我创建两个文件index.js plugins.js.我将这两个文件放置在src/clas ...
- InnoDB中锁的查看
Ⅰ. show engine innodb status\G 1.1 实力分析一波 锁介绍的那篇中已经提到了这个命令,现在我们开一个参数,更细致的分析一下这个命令 (root@localhost) [ ...
- mysql数据库的主从同步,实现读写分离 g
https://blog.csdn.net/qq_15092079/article/details/81672920 前言 1 分别在两台centos 7系统上安装mysql 5.7 2 master ...
- SQL基础语法提纲
一.SQL需知5点 1.SQL是Structured Query Language的缩写,是用来访问关系型数据库的,非过程化的,高级编程语言. 2.SQL具有语法高度综合统一,高度的非过程化,对集合进 ...