P1155 [NOIP 2008 提高组] 双栈排序
将一组数据分成两组,且组内不能冲突。考虑使用二分图。
我们来思考什么样的两个数不能存在于一个栈中。因为最后要求我们升序排序输出,所以在一个栈中的数字必定是降序。
那么当 \(i<j\) 时并且 \(p_i<p_j\)。\(i,j\) 便不能存在于同一个栈中吗?
显然不是,我们来看 \(P=\left [1,3,2,4\right ]\)。前两个数 \(1,3\) 是可以满足上文的情况的,但是他们可以存在在一个栈里面。为什么会造成这种情况呢?我们发现数字 \(1\) 入栈后就可以直接弹,因为它后面没有比它小的数字了。
所以我们还要加一个附加条件。即当 \(i<j<k\) 且 \(p_k<p_i<p_j\) 满足时,\(i,j\) 不能共存于一个栈中。之后我们便在 \(i,j\) 之间建边,去做二分图即可。
之后我们考虑如何让字典序最小,观察到两个栈的操作是独立的,那么如果相邻的两个操作是一个栈插入,另一个栈弹出,那么可以交换位置,以此让字典序达到最小。
讲的很详细了,代码就不放注释了。
#include<bits/stdc++.h>
using namespace std;
const int N=1007;
int n,a[N],cnt=1,tot;
stack<int> s1,s2;
vector<int> G[N];
char ans[N*3];
bool vis[N],col[N];
void dfs(int u,int co){
// cout<<u<<' '<<co<<'\n';
vis[u]=1,col[u]=co;
for(auto v:G[u]){
if(vis[v]) {
if(col[v]==col[u]) {
cout<<0;
exit(0);
}
continue;
}
dfs(v,co^1);
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=n-1,x=a[n];i>1;i--){
for(int j=i-1;j>=1;j--){
if(a[j]<a[i]&&x<a[j]) G[a[j]].push_back(a[i]),G[a[i]].push_back(a[j]);
}
x=min(x,a[i]);
}
for(int i=1;i<=n;i++){
if(!vis[a[i]]) dfs(a[i],0);
}
// for(int i=1;i<=n;i++) cout<<col[i]<<' ';
// cout<<'\n';
for(int i=1;i<=n;i++){
if(col[a[i]]==0) ans[++tot]+='a',s1.push(a[i]);
else ans[++tot]+='c',s2.push(a[i]);
while((!s1.empty()&&s1.top()==cnt)||(!s2.empty()&&s2.top()==cnt)){
if(!s1.empty()&&s1.top()==cnt) ans[++tot]='b',s1.pop(),cnt++;
else ans[++tot]='d',s2.pop(),cnt++;
}
}
for(int i=tot-1;i>=1;i--){
for(int j=i;j<tot;j++){
if((ans[j]=='c'&&ans[j+1]=='b')||(ans[j]=='d'&&ans[j+1]=='a')) swap(ans[j],ans[j+1]);
else break;
}
}
for(int i=1;i<=tot;i++) cout<<ans[i]<<' ';
return 0;
}
P1155 [NOIP 2008 提高组] 双栈排序的更多相关文章
- NOIp2018提高组 双栈排序
这真是道神奇的题目: 原题链接 首先我们要证明以下的性质: 若原序列为\(\{a_n\}\),\(a_i\)和\(a_j\)不能同时放入一个栈中,当且仅当\(i<j,a_i<a_j\),且 ...
- NOIP 2008提高组第三题题解by rLq
啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...
- BZOJ 2080: [Poi2010]Railway 双栈排序
2080: [Poi2010]Railway Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 140 Solved: 35[Submit][Statu ...
- 双栈排序 2008年NOIP全国联赛提高组(二分图染色)
双栈排序 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description Tom最近在研究一个有 ...
- [NOIP2008] 提高组 洛谷P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- NOIP 2008 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 【提高组NOIP2008】双栈排序 (twostack.pas/c/cpp)
[题目描述] Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈 ...
- P1155 双栈排序(二分图染色)
P1155 双栈排序(二分图染色) 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作aaa 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果 ...
随机推荐
- 如何编写Kubernetes的YAML(一)
什么是API对象 作为一个集群操作系统,Kubernetes 归纳总结了 Google 多年的经验,在理论层面抽象出了很多个概念,用来描述系统的管理运维工作,这些概念就叫做"API 对象&q ...
- C# 中比较实用的关键字,基础高频面试题!
前言 在C#编程中关键字是构建逻辑和实现功能的基石,它承载着编程语言的语法规则和编程智慧.熟练掌握这些基础高频关键字对提升编程能力和面试表现至关重要,它们是日常开发和解决复杂问题的关键. DotNet ...
- 国内四大骨干网与十大ISP服务商
1.骨干网 几台计算机连接起来,互相可以看到其他人的文件,这叫局域网,整个城市的计算机都连接起来,就是城域网,把城市之间连接起来的网就叫骨干网.这些骨干网是国家批准的可以直接和国外连接的互联网.其他有 ...
- [每日算法 - 华为机试] 剑指 Offer 10- II. 青蛙跳台阶问题
入口 力扣https://leetcode.cn/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/ 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该 ...
- 《Python基础教程》第三版语录
对程序的结构(如需要哪些类和函数)有一定的想法后,建议你实现一个功能可能极其有限的简单版本. 当你有了可运行的程序后,将发现接下来的工作容易得多.你可添加新功能,修改不喜欢的方面,等等.这样你才能够真 ...
- 武汉工程大学2020GPLT选拔赛(重现赛)
L2-4 缘之空 1.使用倍增法求最近公共祖先,然后利用公共祖先计算两点的树上距离 2.但是此题并没有提供根节点,所以要先找到根节点以后才可以进行倍增法求lca /** - swj - * /> ...
- java基础之object类、Date类、System类、StringBuilder类、包装类、枚举类
一.public String toString() :默认返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值 重写后: @Override public String toStr ...
- Web前端入门第 33 问:CSS 元素外观常用属性(边框、阴影、轮廓、透明度)
background 作为元素外观里的重点功臣介绍完毕,本文再一览其他常用的外观属性. 本文示例中,盒子基础样式: .box { font-size: 20px; margin: 20px; padd ...
- 2025年4月TIOBE指数
4 月头条:编程语言 Kotlin.Ruby 和 Swift 直到最近在 TIOBE 指数排名中都一直稳居前 20 的稳定位置.但如今它们似乎失去了发展动力,且很可能会逐渐过时.Kotlin 和 Sw ...
- issue: java.lang.NoClassDefFoundError: javax/el/ELManager
问题描述: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error c ...