您的位置:首页 > 其它

双栈排序 noip2008

2016-09-07 14:23 330 查看
首先可以看出第一个栈和第二个栈是没什么交集的,那么第一步是对这些元素分别归到两个栈里,

当存在k使i<j<k,a[k]<a[i]<a[j]时,i,j是不能放在一个栈里的,需要一种数据结构表示这种关系,建成图,用二分图的方法判断一下,尽量放到第一个栈里面;

然后就是模拟一下;

自己写无从下手,只好看别人题解后发上来;

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cstdlib>
#include<stack>
using namespace std;
const int maxn=1000+5,inf=2000000000;
int n,a[maxn],ma[maxn][maxn],f[maxn],color[maxn];
void NO_ANSWER(){
printf("0");
exit(0);
}
int x[maxn],y[maxn],topx=0,topy=0;
void dfs(int x,int c){
color[x]=c;
for(int i=1;i<=n;i++){
if(ma[x][i]){
if(!color[i])dfs(i,3-c);
else if(color[i]==c)NO_ANSWER();
}
}
}
void init(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
f[n+1]=inf;
for(int i=n;i>=1;i--)f[i]=min(f[i+1],a[i]);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(a[i]<a[j]&&f[j+1]<a[i])
ma[i][j]=ma[j][i]=1;
for(int i=1;i<=n;i++)if(!color[i])dfs(i,1);
}
void work(){
int now=1;
for(int i=1;i<=n;i++){
if(color[i]==1){
x[++topx]=a[i];
printf("a ");
}
else {
y[++topy]=a[i];
printf("c ");
}
while((topx&&x[topx]==now)||(topy&&y[topy]==now)){
if(topx&&x[topx]==now){
topx--;printf("b ");
}
else {topy--;printf("d ");}
now++;
}
}
}
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
init();
work();
return 0;
}


View Code
因为看别人代码写的,所以比较类似。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: