洛谷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. 【curl】cookie的分隔符

    cookie是以分号作为分隔符的. ex: curl --silent -H "Host: xxx.com" "172.172.178.9:80/item/comm?pi ...

  2. 【java工具类】生成Zip压缩包

    多文件生成压缩包,返回压缩包生成位置的路径. FileUtil.java /** * 文件打压缩包 * @param files * @param Name * @return * @throws E ...

  3. 【java工具类】POI导出excel

    POI的maven依赖:<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi&l ...

  4. 【转】ACM-数学总揽

    转自: http://www.aiuxian.com/article/p-2262657.html 数学也分好几大部分,各种算法也很多,一时不知从哪里开始,算了,具体的后面再说吧,鉴于最近遇到的有关博 ...

  5. 箭头函数详解()=>{}

    摘要:箭头函数有几个使用注意点. (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象,箭头函数继承而来的this指向永远不变. (2)不可以当作构造函数,也就是说,不可以使用n ...

  6. (转)搭建自己的Nuget服务器

    转:https://www.cnblogs.com/knowledgesea/p/5500954.html 序言 你们公司有没有好多项目,有没有好多类库,你们的类库是在tfs中管理,还是svn或者gi ...

  7. C# 读取Excel中的数据到DataTable中

    原文地址:http://www.open-open.com/code/view/1420029490093 public DataTable ExcelToDS(string Path) { stri ...

  8. 一、基础篇--1.1Java基础-面向对象的特征

    面向对象的特征 封装.继承和多态 https://blog.csdn.net/jianyuerensheng/article/details/51602015 封装: 定义:封装就是将数据或函数等集合 ...

  9. Spring boot 自定义一个starter pom

    用过springboot的自动配置会觉得非常方便,我们完全可以自己写一个starter pom,这样不仅可以有自动配置功能,而且具有更通用的的耦合度低的配置, 新建一个starter的maven项目, ...

  10. 如何将post请求转换成put和delete请求

    <form:form action="${pageContext.request.contextPath}/emp" method="POST" mode ...