题目传送门

  传送门I

  传送门II

题目大意

  双栈排序,问最小字典序操作序列。

  不能发现两个数$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 双栈排序 - 贪心 - 二分图的更多相关文章

  1. 洛谷$P1155$ 双栈排序 贪心+二分图匹配

    正解:贪心+二分图匹配 解题报告: 传送门$QwQ$ 跪了,,,我本来以为我$NOIp$做得差不多了,,,然后康了一眼发现没做多少啊其实$QAQ$ 然后来康题趴$QwQ$ 首先考虑如果只有一个栈的情况 ...

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

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

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

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

  4. Luogu1155 NOIP2008 双栈排序 【二分图染色】【模拟】

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

  5. [LuoguP1155]双栈排序_二分图_bfs

    双栈排序 题目链接:https://www.luogu.org/problem/P1155 数据范围:略. 题解: 神仙题. 就第一步就够劝退了. 这个二分图非常不容易,首先只有两个栈,不是属于一个就 ...

  6. 洛谷P1155 双栈排序(贪心)

    题意 题目链接 Sol 首先不难想到一种贪心策略:能弹则弹,优先放A 然后xjb写了写发现只有\(40\),原因是存在需要决策的情况 比如 \(A = {10}\) \(B = {8}\) 现在进来一 ...

  7. 【Luogu】P1155双栈排序(二分图)

    题目链接在此 此题一开始写了个深搜,过了30%的数据,也就是n<=10的那一段.... 然后看了题解发现这是个二分图的判断. 我们先举例子找到不能放进一个栈里的规律.设有数列[2,3,1,4] ...

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

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

  9. 双栈排序(洛谷P1155)二分图的判定+思维贪心

    题目:戳这里 题目大意: 给你一个数列,问能否通过两个栈的push与pop把它输出成一个升序序列(每个数只能入队并出队一次) 不能的话输出0,能的话输出操作方法 主要思路: 1.判断是否可以成功输出升 ...

随机推荐

  1. Hystrix入门与分析(一):初识Hystrix

    在以前的文章中,我们介绍过使用Gauva实现限流的功能,现在我们来了解一下如何在服务框架中实现熔断和降级的方法. 简介Hystrix 大型系统架构的演进基本上都是这样一个方向:从单体应用到分布式架构. ...

  2. TTL是什么意思?

    TTL是一个ip协议的值,它告诉网络,数据包在网络中的时间是否太长而应被丢弃.有很多原因使包在一定时间内不能被传递到目的地. TTL 的初值通常是系统缺省值,是包头中的8位的域.TTL的最初设想是确定 ...

  3. Linux下的搜索查找命令的详解(whereis)

    2.whereis  和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据 ...

  4. gitlab-ci + k8s 之gitlab-ci(一)

    目前常用的持续集成工具主要是jenkins与gitlab-ci ,我已在另一博文中详细记录了jenkins部署过程(其中包括gitlab的搭建),此篇介绍gitlab-ci的使用. 背景介绍 GitL ...

  5. template.js artTemplate 简洁语法官网下载不了 template.js artTemplate 新下载地址

    参考:https://blog.csdn.net/tavatimsa/article/details/82019792

  6. 遍历文件,读取.wxss文件,在头部添加一条注释

    change.pl #!/usr/bin/perl use autodie; use utf8; use Encode qw(decode encode); use v5.26; my $path = ...

  7. fastdfs-nginx-module-master的一些奇怪的特点

    测试环境和生产环境分别是两套fastdfs,但是网络没有隔离,今天发现一个奇怪的现象就是测试环境的文件,通过生产环境的入口,居然也可以访问到,我草了,奇怪了 研究发现功劳是fastdfs-nginx- ...

  8. DEDE暴力破解后台登录页面

    DEDE暴力破解后台登录页面 #!/usr/bin/env python '''/* * author = Mochazz * team = 红日安全团队 * env = pyton3 * */ '' ...

  9. python中的*args和**kw

    学习python装饰器decorator的时候遇到*args和**kw两种函数值传递. 在python中定义函数,可以使用一般参数.默认参数.非关键字参数和关键字参数. 一般参数和默认参数在前面的学习 ...

  10. OAuth2认证和授权入门

    OAuth2四种授权方式 四种授权方式 OAuth 2.0定义了四种授权方式. 密码模式(resource owner password credentials) 授权码模式(authorizatio ...