题面

解题思路

这道题乍一看还以为是个模拟。。怒写一发30分(noip提高组t4有模拟吗?)。

其实很好hack,如

10

10 2 8 1 7 9 3 4 5 6

按模拟的思路,应该是10入第一个栈,2入第一个栈,8入第二个栈,1入第一个栈,把1、2

弹出,所以此时第一个栈还剩10,第二个栈还剩8。7来了入第一个栈,9就无家可归了,这就出问题了,实际上应该让7入第二个栈。结果正解是二分图??像我这样的蒟蒻哪能想出来。。

做法是先选出所有如上的数字对,让他们连边,之后二分图染色,入栈时判断颜色。

代码

#include<bits/stdc++.h>

using namespace std;
const int MAXN = 1005; inline int rd(){
int x=0,f=1;char ch=getchar();
while(ch<'0' || ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0' && ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
} struct Edge{
int nxt,to;
}edge[MAXN<<1]; int n,a[MAXN],col[MAXN];
int head[MAXN],cnt;
bool vis[MAXN]; int st1[MAXN],top1,st2[MAXN],top2,num; inline void add(int bg,int ed){
edge[++cnt].to=ed;
edge[cnt].nxt=head[bg];
head[bg]=cnt;
} inline bool dfs(int x){
vis[x]=1;
for(register int i=head[x];i;i=edge[i].nxt){
if(vis[edge[i].to]){
if(col[edge[i].to]==col[x]) return false;
}
else{
col[edge[i].to]=col[x]^1;
if(!dfs(edge[i].to)) return false;
}
}
return true;
} int main(){
n=rd();
for(register int i=1;i<=n;i++) a[i]=rd();
int k=1e9;
for(register int i=n;i;i--){
k=min(k,a[i]);
for(register int j=1;j<i;j++)
if(a[j]<a[i] && a[j]>k) add(j,i),add(i,j);
}
for(register int i=1;i<=n;i++){
if(!vis[i])
if(!dfs(i)){
puts("0");
return 0;
}
}
num=1;
for(register int i=1;i<=n;i++){
if(col[i]==0){
printf("a ");
st1[++top1]=a[i];
}
else{
printf("c ");
st2[++top2]=a[i];
}
while(st1[top1]==num || st2[top2]==num){
if(st1[top1]==num)
printf("b "),top1--;
else
printf("d "),top2--;
num++;
}
}
while(st1[top1]==num || st2[top2]==num){
if(st1[top1]==num)
printf("b "),top1--;
else
printf("d "),top2--;
num++;
}
return 0;
}

洛谷 P1155 双栈排序的更多相关文章

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

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

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

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

  3. 洛谷——P1155 双栈排序

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

  4. 洛谷P1155 双栈排序

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

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

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

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

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

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

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

  8. P1155 双栈排序(二分图染色)

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

  9. P1155 双栈排序

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

随机推荐

  1. mvc和mvvm区别

    mvc和mvvm区别 MVC和MVVM的区别其实并不大.都是一种设计思想. 主要就是MVC中Controller演变成MVVM中的viewModel. MVVM主要解决了MVC中大量的DOM操作使页面 ...

  2. Android_Gallery(画廊)

    转:http://blog.csdn.net/tianjf0514/article/details/7521398 Gallery是画廊的意思,可以实现图片的浏览功能. 主要内容 Gallery控件的 ...

  3. System.Web.Mvc.HttpHeadAttribute.cs

    ylbtech-System.Web.Mvc.HttpHeadAttribute.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, ...

  4. JS 常用的两个客户端输出方法

    document.write(str)   描述:在网页的<body>标记,输出str的内容.   document意思“文档”,就是整个网页了.   document是一个文档对象,代表 ...

  5. springAop的使用

    AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点 ...

  6. Python基础知识之3——运算符与表达式

    一.概念: 运算符:运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.比如10+4=14,其中操作数是 10 和 4,运算符是“+” . Python 语言主要支持运算符类型有:算术运算 ...

  7. Python全栈开发:进程代码实例

    进程与线程的关系 #!/usr/bin/env python # -*- coding;utf-8 -*- """ 多进程(主进程,子进程): 优点:能同时利用多个CPU ...

  8. eval()方法与str()方法

    eval()方法与str()方法 #_author:Administrator#date:2019/10/31 a={ 'q':{'xxx':3456}}#将一个字典转换成一个字符串a=str(a)p ...

  9. 二分图——最小覆盖poj2226

    详见进阶指南 #include<iostream> #include<cstring> #include<cstdio> using namespace std; ...

  10. JavaScript中数组的基础知识和相关方法

      数组基础 数组是大多数语言里面最常见的一种数据结构,它是一个有序的值列表. 创建数组 1.创建字面量数组 let arr=[]; 2.创建构造函数数组 let arr=new Array(); 注 ...