noip 2008 双栈排序

2023-11-03

题目大意: 给定n和一串数字,这串数字是一个1~n的排列。现在要用两个栈给这些数字排序。首先先判断是否有解,有解的话再输出字典序最小的方案:

入栈1,输出a,出栈1,输出b

入栈2,输出c,出栈2,输出d

分析:

首先必然要先考虑是否有解。对于没有解的情况,必然是当到了某一个数x0时,栈1,栈2队首元素都不能弹出,并且x0要比栈1、2的队首元素都要大,这时就不能排序了。

所以考虑什么时候A、B不能在同一个栈中的情况:

当且仅当,A<B,并且存在C,使得A>C.并满足A位置在B前面,B位置在C前面。就是说,由于C的存在,A不能pop掉,但是B放进去,A就永远pop不了了。

这样就可以找到所有不能和x0在同一个栈里的所有位置上的数了。

判断无解时,将所有上述的A和B之间连一条无向边,用二分图染色或者带偏移量的并查集都可以。

输出时,因为要字典序最小,所以第一个元素必然要放进栈1,这样可以预处理出来所有数要进入哪一个栈。能进栈1的都进栈1.

然后模拟实现,每次先要判断是否可以pop掉栈顶元素,然后按照之前的预处理的方案放进数就可以了。

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int a[N],la[N],co[N];
int n;
int head[N];
int cnt=1;
bool flag=0;

int sta[3][N];//记录栈1、栈2
int top[3];//记录栈顶
int go[N];//这个位置上的数要去哪一个栈
int has;//已经出栈到几号

struct node{
    int to,nxt;
}bian[2*N];
void add(int x,int y)
{
    bian[++cnt].nxt=head[x];
    bian[cnt].to=y;
    head[x]=cnt;
}//建边
void dfs1(int x,int fa,int se)//1 black 2 white
{
    if(flag) return;
    co[x]=se;
    for(int i=head[x];i;i=bian[i].nxt)
    {
        int y=bian[i].to;
        if(y==fa) continue;
        if(co[y])
        {
            if(co[y]==co[x])
            {
                flag=1;return;
            }
        }
        else{
            dfs1(y,x,3-se);
        }
    }
}//二分图染色判断
void dfs2(int x,int se)
{
    go[x]=se;
    for(int i=head[x];i;i=bian[i].nxt)
    {
        int y=bian[i].to;
        if(!go[y])
        {
            dfs2(y,3-se);
        }
    }
}//预处理该去的栈(其实也可以在二分图染色时处理出来,就省了这步)
void check(int now)
{
    bool f=0;
    while(top[now]&&has+1==sta[now][top[now]])
    {
        f=1;
        printf("%c ",now==1?'b':'d');
        has++;
        top[now]--;
    }
    if(f)//成功pop才找另一个
     check(3-now);
}
//检查能否pop
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
     for(int j=n;j>=i+1;j--)
     {
        if(a[i]>a[j]) 
        {la[i]=j;break;}
     }//找到A的最后面一个C的位置。
    for(int i=1;i<=n;i++)
     for(int j=i+1;j<=la[i];j++)
     {
        if(a[i]<a[j])
        {
            add(i,j);
            add(j,i);
         }
     }//A到C之间所有的B都要和A建边
    for(int i=1;i<=n;i++)
    {
        if(flag==1) break;
        if(!co[i]) dfs1(i,0,1);
    }
    if(flag) {
        printf("0");
        return 0;
    }//判断

    go[1]=1;
    for(int x=1;x<=n;x++)
    {
     if(!go[x]) go[x]=1,dfs2(x,1);
    }
    for(int i=1;i<=n;i++)
    {
        check(1);
        check(2);
        sta[go[i]][++top[go[i]]]=a[i];
        printf("%c ",go[i]==1?'a':'c');
    }
    check(1);
    check(2);//最后也要判断,输出完。
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

noip 2008 双栈排序 的相关文章

  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • 【HTML5】登录页面制作简易版

    刚开始学习Java 文件的命名 讲道理应该以英文为主 但是英语又不好 所以只好用拼音 最痛苦的应该算是那些英语又不好 又想秀一下的程序员 一半英语一半拼音 如mainFangFa 你说看了糟心不糟心 目录 1 form表单定义和用法 1 1
  • leetcode解题之200. Number of Islands Java版(岛屿的数量)

    200 Number of Islands Given a 2d grid map of 1 s land and 0 s water count the number of islands An island is surrounded
  • 流的操作

    流 流按照方向分 分为两种输入流和输出流 是以内存作为参照物 当从数据源中 将数据读取到内存中时 叫做输入流 也叫读取流将内存中的数据写入到数据源时 叫做输入流 也叫写入流 流按照传输的内容分 分为 字节流 字符流 对象流 无论是哪一种流
  • python---发送邮件(zmail)

    前言 前面介绍了smtplib的发送邮件方式 今天安静在介绍一种通过zmail来进行发送邮件 但是这个zmail目前只支持python3的版本 那么都在2202年了应该都用python3了吧 zmail zmail目前只支持python3的
  • Arduino esp8266-3.0.1 离线安装

    Arduino esp8266 1 arduino添加开发板 arduino左上角菜单 文件 gt 首选项 出来的设置窗口可以看到 附加开发板管理器网址 添加以下两个网址进去 https arduino esp8266 com stable
  • 栈(Stack)——(二)链式存储实现

    之前的头插法天然满足先进后出 后进先出这个特点 所以我们可以使用链表 设计时选择表头 作为栈顶指针 而不是表尾 单向链表 不含头节点 不同于线式存储 所以不需要作判满操作 链式存储实现代码如下 因为有bool变量 用了C 实现 mystac
  • Amos实操教程

    Amos实操教程 中介效应检验 1 相关概念 2 主界面及功能 3 中介效应 4 中介效应检验步骤 1 相关概念 Amos是什么 Amos的全名是Analysis of Moment Structures 由James L Arbuckle
  • 国密算法概述、及算法的集成应用(sm2、sm3、sm4)

    国密算法概述 及算法的集成应用 sm2 sm3 sm4 一 概述 二 分类概述 3 1 SM1对称密码 3 2 SM2椭圆曲线公钥密码算法 3 3 SM3杂凑算法 3 4 SM4对称算法 3 5 SM7对称密码 3 6 SM9标识密码算法
  • 【满分】【华为OD机试真题2023 JAVA&JS】最优资源分配

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 最优资源分配 知识点数组贪心 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 某块业务芯片最小容量单位为1 25G 总容量为M 1 25G 对该芯片资源编号为1 2
  • win10 VS code 编译运行 C/C++的方法

    win10 VS code 编译运行 C C 的方法 具体配置过程如下链接 https zhuanlan zhihu com p 35178331 但中间出了点问题 CTRL ALT n 运行后 PS D C gt cd d C if gc
  • R语言apply()函数

    apply 函数是一种很强大的机制 apply 可把函数应用到数组的某个维度上 其函数的的一般格式为 apply x MARGIN FUN 其中 x为数据对象 MARGIN是维度的下标 FUN是由你指定的函 数 而 则包括了任何想传递给FU
  • Animator动画混合树

    Unity中的BlendTree BlendTree介绍 BlendTree BlendTree创建 一维混合 1D Blending 二维混合树 每个混合树的动画有一些要注意的地方 BlendTree介绍 Blend Tree用于多个动画
  • ScrollView简单自动滚动问题总结

    今天参考网上的资料写了一个简单的动画 刚开始的时候 确实困难重重 1 当我们在Activity里面获得View对象的时候 无论是getMeasuredHeight 还是getHehgit 方法 放在Activity里的onCreate on
  • 联想拯救者r720自带win10安装linux(ubuntu)双系统

    联想拯救者R720自带win10安装linux ubuntu 双系统 准备事项 ubuntu的u盘启动 网上有教程 下个比较新的版本 本人用的ubuntu16 04 关闭win10的快速启动 也可以不关闭 不关闭的话可能会导致以后ubunt
  • 规律化递归

    递归思想 具体案例 package Java project 1 import java util Scanner public class RecursionDemo public static void main String args
  • k8s知识点拾遗

    目录 Headless和Service ClusterIP模式 Headless模式 Deployment 简述 更新Deployment 回退Deployment Deployment扩容 暂停和恢复Deployment 编写Deploy
  • 通过GitHub Blame深入分析Redux源码

    文章首发于GitHub Blog 说明 本文所分析的Redux版本为3 7 2 分析直接写在了注释里 放在了GitHub上 gt 仓库地址 分析代码时通过查看Github blame 参考了Redux的issue及PR来分析各个函数的意图而
  • 配置SSH Key连接GitLab

    Git配置ssh连接相关命令 1 配置账号 git config global user name cwh git config global user email cwh xxx com 邮箱需要GitLab上账号配置相对应的邮箱 否则拉
  • 2022年「博客之星」参赛博主:落寞的魚丶

    诚信五星 五星必回 https bbs csdn net topics 611387242 spm 1001 2014 3001 6377 诚信五星 五星必回
  • noip 2008 双栈排序

    题目大意 给定n和一串数字 这串数字是一个1 n的排列 现在要用两个栈给这些数字排序 首先先判断是否有解 有解的话再输出字典序最小的方案 入栈1 输出a 出栈1 输出b 入栈2 输出c 出栈2 输出d 分析 首先必然要先考虑是否有解 对于没