首页 > 代码库 > P1155 双栈排序

P1155 双栈排序

双栈排序

洛谷链接

用双栈进行排序,也就是给出一个序列,让你用两个栈来排序,输出排序的操作类型。

实现也比较简单,如果存在一个k,使得i<j<k且a[k]<a[i]<a[j],那么i和j就不能存在一个栈中。

代码:

技术分享
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<stack>
 4 #define N 420000
 5 using namespace std;
 6 int head[N],next[N],to[N],rs[N],n,a[N],f[N],num;
 7 stack<int> s1,s2;
 8 void add(int x,int y){
 9     next[++num]=head[x];
10     to[num]=y;
11     head[x]=num;
12 }
13 int dfs(int x,int c){
14     rs[x]=c;
15     for(int y,i=head[x];i;i=next[i]){
16         y=to[i];
17         if(rs[y]==rs[x]){
18             printf("0");
19             exit(0);
20         }
21         if(!rs[y])
22             dfs(y,-c);
23     }
24 }
25 int main(){
26     scanf("%d",&n);
27     for(int i=1;i<=n;++i)
28         scanf("%d",&a[i]);
29     f[n+1]=N;
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               add(i,j);
35               add(j,i);
36           }
37       }
38     for(int i=1;i<=n;++i){
39         if(!rs[i]){
40             dfs(i,1);
41         }
42     }
43     int aim=1;
44     for(int i=1;i<=n;i++){
45         if(rs[i]==1){
46             printf("a ");
47             s1.push(a[i]);
48         }
49         else{
50             printf("c ");
51             s2.push(a[i]);
52         }
53         while((!s1.empty()&&s1.top()==aim)||(!s2.empty()&&s2.top()==aim)){
54             if(!s1.empty()&&s1.top()==aim){
55                 s1.pop();
56                 printf("b ");
57                 aim++;
58             }
59             else{
60                 s2.pop();
61                 printf("d ");
62                 aim++;
63             }
64         }
65     }
66     return 0;
67 }
View Code

 

P1155 双栈排序