【Luogu】P1155双栈排序(二分图)
题目链接在此
此题一开始写了个深搜,过了30%的数据,也就是n<=10的那一段。。。。
然后看了题解发现这是个二分图的判断。
我们先举例子找到不能放进一个栈里的规律。设有数列【2,3,1,4】
容易模拟得到这个数列单栈是搞不出来的。为什么搞不出来呢?
如果输入的序列是单调递减的,自然一个栈可以搞定。直接全部压栈再全部弹栈就可以了。
如果输入的序列不是单调递减,一个栈也有可能搞定。但是像我们举的这个例子,你压3的时候必须把2压在底下,那怎么先出2后出3呢?
继续模拟能够发现规律:若i、j不能单栈,当且仅当存在k使得i<j<k且que[k]<que[i]<que[j]
于是就可以把不能单栈的元素连一条无向边,剩下的工作就是判断这张图是否是二分图了。
二分图怎么判断呢?由于这张图中相连点只能属于不同的两个集合,要么A要么B,所以我们可以对点染色。比如A连着B,B连着C,我们就可以先给A染成-1,然后给B染成1,然后给C染成-1.如果发现染色有冲突那就连不成二分图。
随后模拟即可
代码如下
#include<iostream>
#include<cctype>
#include<cstdio>
#include<cstring>
int INF=0x7fffffff;
inline long long min(long long a,long long b){ return a<b?a:b; }
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct Edge{
int next,to;
}edge[];
int head[],num;
inline void add(int from,int to){
edge[++num]=(Edge){head[from],to};
head[from]=num;
} int f[];
int que[];
int val[];
int stackA[],topA;
int stackB[],topB; bool dfs(int x,int c){
val[x]=c;
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(val[to]&&val[to]==c) return ;
else if(!val[to]){
val[to]=-c;
if(!dfs(to,-c)) return ;
}
}
return ;
} int main(){
int n=read();
for(int i=;i<=n;++i) que[i]=read();
f[n+]=INF;
for(int i=n;i>=;--i) f[i]=min(f[i+],que[i]);
for(int i=;i<=n;++i)
for(int j=i+;j<=n;++j)
if(f[j+]<que[i]&&que[i]<que[j]){
add(i,j);
add(j,i);
}
for(int i=;i<=n;++i){
if(!val[i]){
bool flag=dfs(i,);
if(!flag){
printf("%d",);
return ;
}
}
}
int cnt=;
for(int i=;i<=n;++i){
if(val[i]==){
printf("a ");
stackA[++topA]=que[i];
}
else{
printf("c ");
stackB[++topB]=que[i];
}
while((topA&&stackA[topA]==cnt)||(topB&&stackB[topB]==cnt)){
if(topA&&stackA[topA]==cnt){
printf("b ");
topA--;
}
else{
printf("d ");
topB--;
}
cnt++;
}
}
return ;
}
【Luogu】P1155双栈排序(二分图)的更多相关文章
- LOJ P1155 双栈排序 二分图染色 图论
https://www.luogu.org/problem/show?pid=P1155 题解: https://www.byvoid.com/zhs/blog/noip2008-twostack 开 ...
- Luogu P1155 双栈排序 图论?模拟吧。。
今天想做做图论,于是点开了这道题....(是二分图染色然而我没看出来) 四种操作及条件: 1. s1.push() 需满足 待push的元素小于栈顶 && { 若在原序列中,待push ...
- P1155 双栈排序(二分图染色)
P1155 双栈排序(二分图染色) 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- NOIP2008双栈排序[二分图染色|栈|DP]
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- [NOIP2008] 提高组 洛谷P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作aaa 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果 ...
- [luogu1155 NOIP2008] 双栈排序 (二分图染色)
传送门 Description Input 第一行是一个整数 n . 第二行有 n 个用空格隔开的正整数,构成一个 1−n 的排列. Output 共一行,如果输入的排列不是"可双栈排序排列 ...
- 洛谷——P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 洛谷P1155 双栈排序
这题什么毒瘤......之前看一直没思路,然后心说写个暴搜看能有多少分,然后就A了??! 题意:给你一个n排列,求它们能不能通过双栈来完成排序.如果能输出最小字典序方案. [update]这里面加了一 ...
随机推荐
- Visual SVN IIS反向代理设置
需要解决的问题: 1. 设置反向代理 2. 解决部分后缀文件无法提交的问题 1. 设置反向代理 接收所有的URL 允许所有的HTTP_HOST 跳转到被代理的服务器 2. 允许所有后缀的文件访问IIS ...
- Azure 项目构建 – 部署 Jenkins 服务器以实现持续集成(CI)
通过完整流程详细介绍了如何通过 Azure 虚拟机.虚拟网络等服务在 Azure 平台上快速搭建 Jenkins 服务器. 此系列的全部课程 https://school.azure.cn/curri ...
- Nengo 神经网络
Nengo被加拿大滑铁卢大学的神经学家和软件工程师表示,这是迄今为止产生的世界上最复杂.最大规模的人类大脑模型模拟.这个名叫Spaun的大脑由250万 个模拟神经元组成,它能执行8种不同类型的任务.这 ...
- 诊断 Grid Infrastructure 启动问题 (文档 ID 1623340.1)
适用于: Oracle Database - Enterprise Edition - 版本 11.2.0.1 和更高版本本文档所含信息适用于所有平台 用途 本文提供了诊断 11GR2 和 12C G ...
- Grid Infrastructure 启动的五大问题 (文档 ID 1526147.1)
适用于: Oracle Database - Enterprise Edition - 版本 11.2.0.1 和更高版本本文档所含信息适用于所有平台 用途 本文档的目的是总结可能阻止 Grid In ...
- 自己太水了—HDOJ_2212
Problem Description A DFS(digital factorial sum) number is found by summing the factorial of every d ...
- Android(java)学习笔记139:Android中Menu的使用(静态 和 动态)
1. 使用xml定义Menu(静态方法) 菜单资源文件必须放在res/menu目录中.菜单资源文件必须使用<menu>标签作为根节点.除了<menu>标签外,还有另外两个标签用 ...
- java里面byte数组和String字符串怎么转换
//string 转 byte[] String str = "Hello"; byte[] srtbyte = str.getBytes(); // byte[] 转 strin ...
- 一个小笔记(5):A*算法
A-Star算法是一种静态路网中求解最短路径最有效的直接搜索方法其实百科有 http://baike.baidu.com/link?url=CvmkWQIAmztYgMq3Nk1WyWkDiC0koV ...
- 解决wpf popup控件遮挡其他程序的问题
public class PopupNonTopmost : Popup { public static DependencyProperty TopmostProperty = Window.Top ...