• 双栈排序 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

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

  • 相关阅读:
    【妖精眼镜】
    神兽保佑-代码无BUG
    Eclipse常用快捷键 及 不格式化注释
    Android dialog 全屏
    eclipse 改变颜色,背景
    GOOGLE和百度的长域名
    Android在ArrayAdapter<>里如何得到List<>的Items
    Android 仿微信朋友圈发动态功能(相册图片多选)
    Android 让GridView的高度为Wrap_content根据内容自适应高度
    C++中函数的返回值
  • 原文地址:https://www.cnblogs.com/chadinblog/p/5849334.html
Copyright © 2020-2023  润新知