#P1108. [NOIP2008提高组] 双栈排序

news2024/11/22 13:19:40

题目描述

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

image

image

操作 aa:将第一个元素压入栈 S_image1S1​。

 

操作 bb:将 S_1S1​ 栈顶元素弹出至输出序列。

操作 cc:将第一个元素压入栈 S_2S2​。

操作 dd:将 S_2S2​ 栈顶元素弹出至输出序列。

如果一个 1\sim n1∼n 的排列 PP 可以通过一系列合法操作使得输出序列为 (1,2,\cdots,n-1,n)(1,2,⋯,n−1,n),Tom 就称 PP 是一个“可双栈排序排列”。例如 (1,3,2,4)(1,3,2,4) 就是一个“可双栈排序序列”,而 (2,3,4,1)(2,3,4,1) 不是。下图描述了一个将 (1,3,2,4)(1,3,2,4) 排序的操作序列:\texttt {a,c,c,b,a,d,d,b}a,c,c,b,a,d,d,b。

image

当然,这样的操作序列有可能有几个,对于上例 (1,3,2,4)(1,3,2,4),\texttt{a,b,a,a,b,b,a,b}a,b,a,a,b,b,a,b 是另外一个可行的操作序列。Tom 希望知道其中字典序最小的操作序列是什么。

输入格式

第一行是一个整数 nn。

第二行有 nn 个用空格隔开的正整数,构成一个 1\sim n1∼n 的排列。

输出格式

共一行,如果输入的排列不是“可双栈排序排列”,输出 0

否则输出字典序最小的操作序列,每两个操作之间用空格隔开,行尾没有空格。

输入数据 1

4
1 3 2 4

Copy

输出数据 1

a b a a b b a b

Copy

输入数据 2

4
2 3 4 1

Copy

输出数据 2

0

Copy

输入数据 3

3
2 3 1

Copy

输出数据 3

a c a b b d

Copy

数据范围与约定

30\%30% 的数据满足:n\le10n≤10。

50\%50% 的数据满足:n\le50n≤50。

100\%100% 的数据满足:n\le1000n≤1000。

NOIP 2008 提高组 第四题

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>

using namespace std;

const int N=1010;
int n,a[N];
char s[N];
struct node{
    int x,y,nxt;
};
node way[N<<1];
int st[N],tot=0,co[N],st1[N],st2[N];

void add(int u,int w)
{
    tot++;
    way[tot].x=u;way[tot].y=w;way[tot].nxt=st[u];st[u]=tot;
    tot++;
    way[tot].x=w;way[tot].y=u;way[tot].nxt=st[w];st[w]=tot;
}

void doit()
{
    int i,j;
    memset(co,-1,sizeof(co));
    queue<int> q;
    q.push(way[1].x);
    co[way[1].x]=0;
    while (!q.empty())   //染色 
    {
        int r=q.front();
        q.pop();
        for (i=st[r];i;i=way[i].nxt)
        {
            if (co[way[i].y]==-1) 
            {
                co[way[i].y]=(co[r]==0 ? 1:0);
                q.push(way[i].y);
            }
            else if (co[way[i].y]==co[r])
            {
                printf("0\n");
                return;
            }
        }
    }
    int t=-1,t1=0,t2=0,k=1;
    for (i=1;i<=n;i++)
    {
        if (a[k]==i)
        {
            printf("a b ");k++;
            continue;
        }
        if (st1[t1]==i)
        {
            printf("b "); t1--; continue;
        }
        if (st2[t2]==i)
        {
            printf("d "); t2--; continue;
        }
        while (a[k]!=i)
        {
            if (co[k]==0||co[k]==-1)
               printf("a "),st1[++t1]=a[k];
            else printf("c "),st2[++t2]=a[k];
            k++;
        }
        printf("a b ");k++;
    }
    return; 
}

int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for (int i=1;i<n-1;i++)  //i<j<k  a[k]>a[i]>a[j]
        for (int j=i+1;j<n;j++)
        {           
            if (a[i]<a[j])
            for (int k=j+1;k<=n;k++)
                if (a[k]<a[i])
                {
                    add(i,j);break;
                } 
        }
    doit();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/795521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

13.5.3 【Linux】PAM 模块设置语法

PAM 借由一个与程序相同文件名的配置文件来进行一连串的认证分析需求。我们同样以passwd 这个指令的调用 PAM 来说明好了。 当你执行 passwd 后&#xff0c;这支程序调用 PAM 的流程是&#xff1a; 1. 使用者开始执行 /usr/bin/passwd 这支程序&#xff0c;并输入密码&#xf…

windos 服务器设置指定ip访问指定端口,其他ip不能访问

需求&#xff1a;设置指定ip访问指定端口&#xff0c;其他ip不能访问 一&#xff0c;禁止所有ip访问 需要打开IP安全策略 或者winR 输入secpol.msc 1.先创建一个ip安全策略 2.点击添加&#xff0c;不使用添加向导&#xff0c;建一个安全策略 继续点添加 二&#xff0c;放开需…

01 Excel常用高频快捷键汇总

目录 一、简介二、快捷键介绍2.1 常用基本快捷键1 复制&#xff1a;CtrlC2 粘贴&#xff1a;CtrlV3 剪切&#xff1a;CtrlX4 撤销&#xff1a;CtrlZ5 全选&#xff1a;CtrlA 2.2 常用高级快捷键1 单元格内强制换行&#xff1a;AltEnter2 批量输入相同的内容&#xff1a;CtrlEnt…

448.找到所有数组中消失的数字

448.找到所有数组中消失的数字 class Solution {public List<Integer> findDisappearedNumbers(int[] nums) {int[] temp new int[nums.length1];for (int i 0; i < nums.length; i) {temp[nums[i]];}ArrayList<Integer> list new ArrayList<>();for (…

【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Linux——设备模型

目录 本章目标 一、设备模型基础 二、总线、设备和驱动 --------------------------------------------------------------------------------------------------------------------------------- 工作两周了&#xff0c;真吃不消啊&#xff0c;虽然年轻但是早8.30晚10点还…

JAVA面试总结-Redis篇章(四)——双写一致性

JAVA面试总结-Redis篇章&#xff08;四&#xff09;——双写一致性 问&#xff1a;redis 做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&#xff1f;第一种情况&#xff0c;如果你的项目一致性要求高的话 采用以下逻辑我们应该先删除缓存&#xff0c;再修改数据库&…

【C++】STL——string的模拟实现、常用构造函数、迭代器、运算符重载、扩容函数、增删查改

文章目录 1.模拟实现string1.1构造函数1.2迭代器1.3运算符重载1.4扩容函数1.5增删查改 1.模拟实现string string使用文章 1.1构造函数 这里我们实现常用的第四个string(const char* s)和析构函数 class string { public://初始化列表赋值//string(const char* str "\0…

如何搭建一个成功的书店小程序

随着互联网的快速发展&#xff0c;传统实体书店面临着客流量下降的困境。为了适应市场需求&#xff0c;书店行业转型变得尤为重要。而制作书店小程序商城则成为了一种必备的转型方式。下面将详细介绍如何利用专业的小程序商城制作平台&#xff0c;手把手制作书店小程序商城。 首…

Docker 基础知识解析:容器与虚拟化的区别与优势

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

DTH11 温湿度模块

文章目录 前言一、DTH11 模块介绍二、设备树设置三、驱动程序四、测试程序五、上机测试及效果总结 前言 DHT11 是一款可测量 温度 和 湿度 的传感器。比如市面上一些空气加湿器&#xff0c;会测量空气中湿度&#xff0c;再根据测量结果决定是否继续加湿。 一、DTH11 模块介绍 …

VS下c++解析pcap文件

一、pcap文件格式 https://www.cnblogs.com/Chary/articles/15716063.html 接口协议&#xff08;四&#xff09;&#xff1a;以太网&#xff08;Ethernet&#xff09;学习&#xff08;一&#xff09;&#xff1a;协议_以太网协议_QNee的博客-CSDN博客 二、代码 pcapParser.h #…

向npm注册中心发布包(下)

目录 1、在package.json文件中指定dependencies和devDependencies 1.1 将依赖项添加到 package.json 文件 1.2 从命令行中 将依赖项添加到 package.json 文件 1.3 手动编辑 package.json 文件 2、关于语义版本控制 2.1 在已发布的包中增加语义版本 2.2 使用语义版本控制…

CentOS7系统Nvidia Docker容器基于TensorFlow2.12测试GPU

CentOS7系统Nvidia Docker容器基于TensorFlow1.15测试GPU 参考我的另一篇博客 1. 安装NVIDIA-Docker的Tensorflow2.12.0版本 1. 版本依赖对应关系&#xff1a;从源代码构建 | TensorFlow GPU 版本Python 版本编译器构建工具cuDNNCUDAtensorflow-2.6.03.6-3.9GCC 7.3.1Ba…

Linux设置密码复杂度

在etc目录下pam.d目录下&#xff0c;存在system-auth文件 先将文件备份下&#xff0c;然后在system-auth中插入下面行 password requisite pam_pwquality.so try_first_pass local_users_only retry3 authtok_type minlen8 lcredit-1 ucredit-1 dcredit-1 ocredi…

OpenCV 4.0+Python机器学习与计算机视觉实战

&#x1f482; 个人网站:【办公神器】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言第一部分&…

Shell脚本学习-变量子串

变量子串&#xff1a; man bash&#xff0c;然后搜索&#xff1a;Parameter Expansion。 参数拓展 $字符引进、提出了参数拓展、命令替换和数字替换。变量名或标识被大括号包围才能够被拓展。 我们可以记住一个表&#xff1a; 序号表达式说明1${parameter}返回变量$paramete…

东南大学齿轮箱故障诊断(Python代码,CNN结合LSTM模型)

运行代码要求&#xff1a; 代码运行环境要求&#xff1a;Keras版本>2.4.0&#xff0c;python版本>3.6.0 1.东南大学采集数据平台&#xff1a; 数据 该数据集包含2个子数据集&#xff0c;包括轴承数据和齿轮数据&#xff0c;这两个子数据集都是在传动系动力学模拟器&am…

PVS-Studio Crack,重新编译后的自动分析

PVS-Studio Crack,重新编译后的自动分析 PVS Studio执行静态代码分析并生成报告&#xff0c;帮助程序员查找和修复错误。PVS Studio执行广泛的代码检查&#xff0c;搜索印刷错误和复制粘贴错误也很有用。此类错误的示例&#xff1a;V501、V517、V522、V523、V3001。 静态分析的…

常常会用到的截取字符串substr()、substring()、slice()方法详解

常常会用到的截取字符串substr()、substring()、slice()方法详解 slice() 定义&#xff1a;接受一个或者两个参数&#xff0c;第一个参数指定子字符串的开始位置。第二个参数表示子字符串的结束位置&#xff08;不包括结束位置的那个字符&#xff09;&#xff0c;如果没有传递…