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 如果 ...
随机推荐
- 事务及mysql中的隔离级别
事务,一个或一组sql语句组成的执行单元,是最小的执行单元,要么全执行,要么全不执行.如果单元中某条sql语句执行失败,整个单元将会回滚,所有受影响的数据返回到事务开始前的状态. 事务具有ACID四个 ...
- Vue3-DeepSeek-Chat流式AI对话|vite6+vant4+deepseek智能ai聊天助手
原创新作vue3.5+deepseek+vant4+vant4仿DeepSeek-R1流式输出ai聊天对话. deepseek-vue3-chat : 实战2025智能大模型ai会话,基于Vue3+V ...
- FastAPI测试策略:参数解析单元测试
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长 探索数千个预构建的 AI 应用,开启你的下一个伟大创意 第一章:核心测试方法论 1.1 三层测试体系架构 # 第一层:模型级测试 def ...
- anaconda创建新环境
博客地址:https://www.cnblogs.com/zylyehuo/ anaconda创建新环境 conda create -n 环境自定义的名称 python=版本号 anaconda指定路 ...
- webpack3使用additionalData和prependData都不管用
10.css相关配置 utils.js sass: generateLoaders('sass', { indentedSyntax: true, implementation: require('n ...
- panic: qtls.ConnectionState not compatible with tls.ConnectionState
问题重现 之前一个 go-micro 1.18 的项目 执行 go run main.go 命令时出现以下报错 go run main.go panic: qtls.ConnectionState n ...
- TJSON的烦人的泄漏
System.Json中的JSON应该说还是好用的,因为相关superObject的json使用,转换过来概念思路上有点混淆搞不清. 正题:老是泄漏.一会儿是TJSONArray,一会儿是TJSONO ...
- 云备份技术解析:云容灾 CT-CDR 关键技术介绍
本文分享自天翼云开发者社区<云备份技术解析:云容灾 CT-CDR 关键技术介绍>,作者:沈****军 1.CDP+存储快照,实现秒级RPO (1)CDP技术:云容灾CT-CDR(Cloud ...
- @Transactional的属性
@Transactional的属性: isolation-Isolation:事务的隔离级别(与并发相关) noRollbackFor-Class[]:那些异常,事务可以不回滚 noRollbackF ...
- 第十五届蓝桥杯javaA组 砍柴 (两种写法)详解
参考资料 原题链接砍柴 - 蓝桥云课 (lanqiao.cn) 区间质数搜索--埃拉托斯特尼筛法和欧拉筛法-CSDN博客 思路 质数筛 + 二分 + 博弈 + 状态机(只因bushi) $$ 状态转移 ...