题目链接在此

此题一开始写了个深搜,过了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双栈排序(二分图)的更多相关文章

  1. LOJ P1155 双栈排序 二分图染色 图论

    https://www.luogu.org/problem/show?pid=P1155 题解: https://www.byvoid.com/zhs/blog/noip2008-twostack 开 ...

  2. Luogu P1155 双栈排序 图论?模拟吧。。

    今天想做做图论,于是点开了这道题....(是二分图染色然而我没看出来) 四种操作及条件: 1. s1.push() 需满足 待push的元素小于栈顶 && { 若在原序列中,待push ...

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

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

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

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

  5. NOIP2008双栈排序[二分图染色|栈|DP]

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

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

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

  7. P1155 双栈排序

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

  8. [luogu1155 NOIP2008] 双栈排序 (二分图染色)

    传送门 Description Input 第一行是一个整数 n . 第二行有 n 个用空格隔开的正整数,构成一个 1−n 的排列. Output 共一行,如果输入的排列不是"可双栈排序排列 ...

  9. 洛谷——P1155 双栈排序

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

  10. 洛谷P1155 双栈排序

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

随机推荐

  1. Android中的ListView属性使用总结

    Android中使用ListView控件比较常见,如果能知道常用的一些属性使用,肯定会少很多坑. 1.ListView是常用的显示控件,默认背景是和系统窗口一样的透明色,如果给ListView加上背景 ...

  2. 微软爆料新型系统,Windows7,Windows10强势来袭

    本系统是10月5日最新完整版本的Windows10 安装版镜像,win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为win10 Edge浏览器中国默认主页和搜索引擎 ...

  3. Android(java)学习笔记147:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)

    1. 有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高 ...

  4. 一个制作Xcode5插件的模板

    原Github地址:https://github.com/kattrali/Xcode5-Plugin-Template 安装将 本工成复制到~/Library/Developer/Xcode/Tem ...

  5. Django auth权限

    创建超级管理员命令 python manage.py createsuperuser --username hello 检查和校验用户 from django.contrib import auth ...

  6. FIBON高精度

    #include<stdio.h> #include<string.h> int u,n; ],b[],h[]; ],y[],z[]; int main() { char s( ...

  7. webpack打包性能分析

    1. 如何定位webpack打包速度慢的原因 首先需要定位webpack打包速度慢的原因,才能因地制宜采取合适的方案,我们可以在终端输入: webpack --profile --json > ...

  8. caffe修改需要的东西 6:40

    https://blog.csdn.net/zhaishengfu/article/details/51971768?locationNum=3&fps=1

  9. CPP-网络/通信:POST

    BOOL PostSubmit(CString strUrl,const CString&strPara, CString&strContent){ BOOL bRet=FALSE; ...

  10. Bootstrap历练实例:按钮组大小

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...