双栈排序 noip2008

 

首先可以看出第一个栈和第二个栈是没什么交集的,那么第一步是对这些元素分别归到两个栈里,

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

然后就是模拟一下;

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

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<iomanip>
 7 #include<cstdlib>
 8 #include<stack>
 9 using namespace std;
10 const int maxn=1000+5,inf=2000000000;
11 int n,a[maxn],ma[maxn][maxn],f[maxn],color[maxn];
12 void NO_ANSWER(){
13     printf("0");
14     exit(0);
15 }
16 int x[maxn],y[maxn],topx=0,topy=0;
17 void dfs(int x,int c){
18     color[x]=c;
19     for(int i=1;i<=n;i++){
20         if(ma[x][i]){
21             if(!color[i])dfs(i,3-c);
22             else if(color[i]==c)NO_ANSWER();
23         }
24     }
25 }
26 void init(){
27     scanf("%d",&n);
28     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
29     f[n+1]=inf;
30     for(int i=n;i>=1;i--)f[i]=min(f[i+1],a[i]);
31     for(int i=1;i<=n;i++)
32         for(int j=i+1;j<=n;j++)
33             if(a[i]<a[j]&&f[j+1]<a[i])
34                 ma[i][j]=ma[j][i]=1;
35     for(int i=1;i<=n;i++)if(!color[i])dfs(i,1);
36 }
37 void work(){
38     int now=1;
39     for(int i=1;i<=n;i++){
40         if(color[i]==1){
41             x[++topx]=a[i];
42             printf("a ");
43         }
44         else {
45             y[++topy]=a[i];
46             printf("c ");
47         }
48         while((topx&&x[topx]==now)||(topy&&y[topy]==now)){
49             if(topx&&x[topx]==now){
50                 topx--;printf("b ");
51             }
52             else {topy--;printf("d ");}
53             now++;
54         }
55     }
56 }
57 int main(){
58     freopen("1.in","r",stdin);
59     freopen("1.out","w",stdout);
60     init();
61     work();
62     return 0;
63 }
View Code

因为看别人代码写的,所以比较类似。

posted @ 2016-09-07 14:23  CHADLZX  阅读(129)  评论(0编辑  收藏  举报