LOJ P1155 双栈排序 二分图染色 图论
https://www.luogu.org/problem/show?pid=P1155
题解: https://www.byvoid.com/zhs/blog/noip2008-twostack
开始读的代码来自 http://hzwer.com/5071.html
结论P: S[i],S[j]两个元素不能进入同一个栈 <=> 存在k,满足i<j<k,使得S[k]<S[i]<S[j].
二分图染色判断两个数能不能在同一个栈里,确定了每个数应该进入的栈之后直接模拟就好了。
开始我忘了把f[n+1]设成极大值,wa了无数次,mdzz。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=;
int n;
int a[maxn]={},f[maxn]={};
struct nod{
int y,next;
}e[maxn*maxn];
int head[maxn]={},c[maxn]={},tot=;
int s1[maxn]={},s2[maxn]={},t1=,t2=;
inline void init(int x,int y){e[++tot].y=y;e[tot].next=head[x];head[x]=tot;}
bool dfs(int x,int v){
c[x]=v;
for(int i=head[x];i;i=e[i].next){
if(!c[e[i].y]){
if(!dfs(e[i].y,-v))return ;
}
else if(c[x]==c[e[i].y]){
return ;
}
}return ;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
f[n+]=(int)1e9;
f[n]=a[n];
for(int i=n-;i;i--)f[i]=min(f[i+],a[i]);
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
if(a[i]<a[j]&&f[j+]<a[i]){init(i,j);init(j,i);}
}
}
for(int i=;i<=n;i++){
if(!c[i]){
if(!dfs(i,)){
printf("");
return ;
}
}
}
int now=;
for(int i=;i<=n;i++){
if(i!=)printf(" ");
if(c[i]==){printf("a");s1[++t1]=a[i];}
else {printf("c");s2[++t2]=a[i];}
while(s1[t1]==now||s2[t2]==now){
printf(" ");
if(s1[t1]==now){printf("b");t1--;}
else{printf("d");t2--;}
++now;
}
}
return ;
}
LOJ P1155 双栈排序 二分图染色 图论的更多相关文章
- NOIP2008双栈排序[二分图染色|栈|DP]
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- [luogu1155 NOIP2008] 双栈排序 (二分图染色)
传送门 Description Input 第一行是一个整数 n . 第二行有 n 个用空格隔开的正整数,构成一个 1−n 的排列. Output 共一行,如果输入的排列不是"可双栈排序排列 ...
- [NOIp2008] 双栈排序 (二分图染色 + 贪心)
题意 给你一个长为 \(n\) 的序列 \(p\) ,问是否能够通过对于两个栈进行 push, pop(print) 操作使得最后输出序列单调递增(即为 \(1 \cdots n\) ),如果无解输出 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- P1155 双栈排序(二分图染色)
P1155 双栈排序(二分图染色) 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一 ...
- [NOIP2008] 提高组 洛谷P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作aaa 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果 ...
- 洛谷——P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- Luogu P1155 双栈排序 图论?模拟吧。。
今天想做做图论,于是点开了这道题....(是二分图染色然而我没看出来) 四种操作及条件: 1. s1.push() 需满足 待push的元素小于栈顶 && { 若在原序列中,待push ...
随机推荐
- python函数,模块及eclipse配置python开发环境
一.eclipse的使用 1.作用 (1)最好用的IDE (2)可调式debug (3)查看可执行过程 (4)可查看源代码 2.安装eclipse及配置 目录安装Pythonpython for ec ...
- 【HASPDOG】卸载
rpm -qa | grep aksusdb rpm -e aksusdb... rm -rf /var/hasplm
- Linux 内核驱动--多点触摸接口【转】
转自:http://blog.csdn.net/joard_yang/article/details/6225937 译自:linux-2.6.31.14/Documentation/input/mu ...
- kworker内核工作队列详解
工作队列是另一种将工作推后执行的形式,它可以把工作交给一个内核线程去执行,这个下半部是在进程上下文中执行的,因此,它可以重新调度还有睡眠. 区分使用软中断/tasklet还是工作队列比较简单,如 ...
- 20 Organizing Go code 组织go代码
Organizing Go code 16 August 2012 Introduction Go code is organized differently to that of other lan ...
- 09 Command Documentation 命令文档
Command Documentation 命令文档 There is a suite of programs to build and process Go source code. Inste ...
- 使用os模块实现展示目录下的文件和文件夹
Windows 10家庭中文版,Python 3.6.4 今天学习了os模块,下面是使用它开发的一个展示目录下的文件和文件夹的函数,代码如下: import os # deep大于等于1的整数,默认为 ...
- J2V8 For Android
J2V8是基于Google的JavaScript引擎V8的Java开源项目,实现Java和JavaScript的相互调用.并对Android平台提供支持,最新版本提供了aar格式的类库包方便Andro ...
- 在虚拟机(vmware)上安装CentOS
第一步是安装虚拟机,这个比较简单就不讲了. 第二步准备CentOS的镜像文件准备安装 第三步安装CentOS: 新建虚拟机 选择自定义配置 选择硬件兼容标准 选择是否让vmware安装操作系统 选择将 ...
- gitlab备份与还原
1.备份 登录原服务器,执行命令: gitlab-rake gitlab:backup:create 备份后文件在如下目录,下载该文件 /var/opt/gitlab/backups 2.还原 先安装 ...