洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷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 双栈排序题解(图论模型转换+二分图染色+栈)的更多相关文章
- [NOIP2008] 提高组 洛谷P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 洛谷——P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 洛谷 P1155 双栈排序
题面 解题思路 这道题乍一看还以为是个模拟..怒写一发30分(noip提高组t4有模拟吗?). 其实很好hack,如 10 10 2 8 1 7 9 3 4 5 6 按模拟的思路,应该是10入第一个栈 ...
- 洛谷$P1155$ 双栈排序 贪心+二分图匹配
正解:贪心+二分图匹配 解题报告: 传送门$QwQ$ 跪了,,,我本来以为我$NOIp$做得差不多了,,,然后康了一眼发现没做多少啊其实$QAQ$ 然后来康题趴$QwQ$ 首先考虑如果只有一个栈的情况 ...
- 洛谷P1155 双栈排序
这题什么毒瘤......之前看一直没思路,然后心说写个暴搜看能有多少分,然后就A了??! 题意:给你一个n排列,求它们能不能通过双栈来完成排序.如果能输出最小字典序方案. [update]这里面加了一 ...
- 洛谷P1155 双栈排序(贪心)
题意 题目链接 Sol 首先不难想到一种贪心策略:能弹则弹,优先放A 然后xjb写了写发现只有\(40\),原因是存在需要决策的情况 比如 \(A = {10}\) \(B = {8}\) 现在进来一 ...
- 洛谷P1155 双栈排序——思路题
题目:https://www.luogu.org/problemnew/show/P1155 思路... 看博客:https://www.cnblogs.com/Narh/p/9213825.html ...
- AC日记——双栈排序 洛谷 P1155
双栈排序 思路: 二分图染+模拟: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 #define ...
- 洛谷 P1155 【NOIP2008】双栈排序
题目链接 题解 这题有点神啊.. 我们仔细观察一下,发现两个栈内元素必须为降序 那么有结论 如果有\(i < j < k\) 且 \(a[k] < a[i] < a[j]\)则 ...
随机推荐
- shell练习--PAT题目1005:继续(3n+1)猜想(全绿失败喜加一)
卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对 n=3 进行验证的时 ...
- mysql存储ip数值
字段使用 int unsigned 类型就可以满足存贮ip2long(ip)的数值 插入时,可以使用inet_aton('100.200.30.22') 将ip地址转换为数值 查询时,使用inet_n ...
- Redis实战(十三)Redis的三种集群方式
序言 能聊聊redis cluster集群模式的原理吗 资料 https://www.cnblogs.com/51life/p/10233340.html Redis 集群分片原理
- BZOJ 3193: [JLOI2013]地形生成 计数 + 组合 + 动态规划
第一问: 先不考虑山的高度有相同的:直接按照高度降序排序,试着将每一座山插入到前面山的缝隙中. 当然,这并不代表这些山的相对位置是固定的,因为后面高度更低的山是有机会插入进来的,所以就可以做到将所有情 ...
- (51)LINUX应用编程和网络编程之六Linux高级IO
3.6.1.非阻塞IO 3.6.1.1.阻塞与非阻塞 阻塞:阻塞具有很多优势(是linux系统的默认设置),单路IO的时候使用阻塞式IO没有降低CPU的性能 补充:阻塞/非阻塞, 它们是程序在等待消息 ...
- java把含小数点的数字字符串转换为int类型
String num ="1.00"; int abc =Double.valueOf(num).intValue();//转换为Int类型
- iOS 消息转发以及 NSProxy 实战
最后更新: 2018-01-17 一.消息派发机制-NSObject 在 iOS 开发中, 调用对象的方法就是给对象发送一个消息.了解消息的派发机制对于iOS开发来说是一个很实用且强大的工具, 下面我 ...
- babel简介——简单介绍与实用(转)
博客讲解内容如下: 1.babel是什么 2.javascript制作规范 3.babel转译器 4.babel的使用 5.常见的几种babel转译器和插件 6.babel最常见配置选项 7.babe ...
- Vuex入门(转)
参考:https://segmentfault.com/a/1190000015782272 https://www.cnblogs.com/y896926473/p/6709733.html 如果你 ...
- Java中创建String的两种方式
1.在Java中,创建一个字符串有两种方式 String x = "abc";String y = new String("abc"); 这两种方式有什么区别呢 ...