洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

标签:题解

阅读体验:https://zybuluo.com/Junlier/note/1311990

原题地址:洛谷P1155 双栈排序

那么讲题了

很好的一道图论模型转化的题目

考虑什么情况下两个元素一定要放在不同的栈内

经过一番仔细思考+草稿模拟你会得出

当且仅当存在三元组\((i,j,k)\),其中\(i<j<k\)且\(v[k]<v[i]<v[j]\)时,\(i\)和\(j\)一定要放在两个不同的栈内

抽象理解一下,如果\(i,j\)放在同一个栈内,后面还有一个比\(v[i],v[j]\)都小的\(v[k]\),那么两个栈内元素都是递增的了,无论如何也排不好序

那么根据这个建出一个图(转化模型)

当存在上面的情况时,在\((i,j)\)间连一条边,表示\(i,j\)要在不同的栈内

就可以跑二分图染色判断合法性了,然后染完色根据题目模拟即可

题目还是很好的,多掌握一点题型就少一点措手不及

#include<bits/stdc++.h>
#define il inline
#define rg register
#define ldb double
#define lst long long
#define rgt register int
#define N 1050
#define M 1000050
#define qw ljl[i].to
using namespace std;
const int Inf=1e9;
il int MAX(rgt x,rgt y){return x>y?x:y;}
il int MIN(rgt x,rgt y){return x<y?x:y;}
il int read()
{
int s=0,m=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')m=1;ch=getchar();}
while( isdigit(ch))s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
} int n;
int v[N],Min[N];
stack<int> st1,st2;
int hd[N],vis[N],col[N],cnt;
struct EDGE{int to,nxt;}ljl[M<<1];
il void Add(rgt p,rgt q){ljl[++cnt]=(EDGE){q,hd[p]},hd[p]=cnt;} void Dfs(rgt now,rgt C)
{
vis[now]=1,col[now]=C;
for(rgt i=hd[now];i;i=ljl[i].nxt)
{
if(vis[qw])
{
if(col[qw]==C)puts("0"),exit(0);
continue;
}Dfs(qw,C^1);
}
} int main()
{
n=read(),Min[n+1]=Inf;
for(rgt i=1;i<=n;++i)v[i]=read();
for(rgt i=n;i>=1;--i)Min[i]=MIN(Min[i+1],v[i]);
for(rgt i=1;i<n;++i)
for(rgt j=i+1;j<=n;++j)
if(v[i]<v[j]&&Min[j+1]<v[i])
Add(i,j),Add(j,i);
for(rgt i=1;i<=n;++i)if(!vis[i])Dfs(i,0);
rgt wnt=1;
for(rgt i=1;i<=n;++i)
{
if(col[i])st2.push(v[i]),printf("c ");
else st1.push(v[i]),printf("a ");
while((!st1.empty()&&st1.top()==wnt)||(!st2.empty()&&st2.top()==wnt))
{
if(!st1.empty()&&st1.top()==wnt)st1.pop(),printf("b ");
else st2.pop(),printf("d ");++wnt;
}
}return puts(""),0;
}

洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)的更多相关文章

  1. [NOIP2008] 提高组 洛谷P1155 双栈排序

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

  2. 洛谷——P1155 双栈排序

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

  3. 洛谷 P1155 双栈排序

    题面 解题思路 这道题乍一看还以为是个模拟..怒写一发30分(noip提高组t4有模拟吗?). 其实很好hack,如 10 10 2 8 1 7 9 3 4 5 6 按模拟的思路,应该是10入第一个栈 ...

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

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

  5. 洛谷P1155 双栈排序

    这题什么毒瘤......之前看一直没思路,然后心说写个暴搜看能有多少分,然后就A了??! 题意:给你一个n排列,求它们能不能通过双栈来完成排序.如果能输出最小字典序方案. [update]这里面加了一 ...

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

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

  7. 洛谷P1155 双栈排序——思路题

    题目:https://www.luogu.org/problemnew/show/P1155 思路... 看博客:https://www.cnblogs.com/Narh/p/9213825.html ...

  8. AC日记——双栈排序 洛谷 P1155

    双栈排序 思路: 二分图染+模拟: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 #define ...

  9. 洛谷 P1155 【NOIP2008】双栈排序

    题目链接 题解 这题有点神啊.. 我们仔细观察一下,发现两个栈内元素必须为降序 那么有结论 如果有\(i < j < k\) 且 \(a[k] < a[i] < a[j]\)则 ...

随机推荐

  1. spark读取kafka数据 createStream和createDirectStream的区别

    1.KafkaUtils.createDstream 构造函数为KafkaUtils.createDstream(ssc, [zk], [consumer group id], [per-topic, ...

  2. Text-CNN 文本分类

    1.简介 TextCNN 是利用卷积神经网络对文本进行分类的算法,由 Yoon Kim 在 “Convolutional Neural Networks for Sentence Classifica ...

  3. PHP基础教程 10款人气暴涨的PHP开源工具

    若想创建动态而又新颖的Web应用程序,PHP便是理想的选择.不用说,在Web开发世界里,PHP是最流行的语言之一.一些非常好用的PHP开源工具着实拯救了不少开发任务繁重的PHP开发 人员,减轻他们的开 ...

  4. Shell中Bash的基本功能(二)

    1 历史命令 1)历史命令的查看[root@localhost ~]# history [选项] [历史命令保存文件]选项:-c: 清空历史命令-w: 把缓存中的历史命令写入历史命令保存文件.如果不手 ...

  5. Spring Boot教程(八)创建含有多module的springboot工程

    创建根工程 创建一个maven 工程,其pom文件为: <?xml version="1.0" encoding="UTF-8"?> <pro ...

  6. Struts2漏洞修复总结

    Struts2的S2-016漏洞是之前比较重大的漏洞,也是一些老系统的历史遗留问题 此漏洞影响struts2.0-struts2.3的所有版本,可直接导致服务器被远程控制从而引起数据泄漏,影响巨大 漏 ...

  7. php数组合并用加号(+)和用array_merge()的区别

    结论:用加号合并数组:既考虑数字索引的键值对,也考虑字符串索引的键值对,用前边数组的值覆盖后边的键名相同的值; 用array_merge()合并数组:只考虑字符串索引的键值对,用后边数组的值覆盖掉前面 ...

  8. 案例ORA-00600: internal error code, arguments: [qkaffsindex3], [], [], [], []

    执行更新统计信息语句: exec dbms_stats.gather_schema_stats(ownname=>'LIVE_KS',degree=>2,cascade=>true, ...

  9. npm 错误记录

    npm run dev iview-weapp@1.1.0 dev /Users/Jovins/Desktop/小程序/iview-weapp gulp --gulpfile build/build- ...

  10. 555E Case of Computer Network

    分析 一个连通块内的肯定不影响 于是我们先缩点 之后对于每个路径 向上向下分别开一个差分数组 如果两个数组同时有值则不合法 代码 #include<bits/stdc++.h> using ...