• Luogu P1155 双栈排序 图论?模拟吧。。


    今天想做做图论,于是点开了这道题。。。。(是二分图染色然而我没看出来)

    四种操作及条件:

      1. s1.push() 需满足 待push的元素小于栈顶 && {

        若在原序列中,待push元素的后面存在一个比 待push元素大 且比 s2.top() 大的元素,记为a ,那么显然在a被push以前,待push元素和s2.top(),一定会被pop()掉

        那么如果此时在a后,有一个比 待push元素 小的数,那么一定不能把这个待push的元素 push到 s1 中

      } 则ans[++cnt]='a'

      2.s1.pop() 需满足 s1.top()=应该pop()的元素 则ans[++cnt]='b'

      3.s2.push() 需满足 待push的元素小于栈顶 则ans[++cnt]='c'

      4.s2.pop() 需满足 s2.top()=应该pop()的元素 则ans[++cnt]='d'

    否则,无解。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define R register int
    #define getchar() *S++
    #define pc(x) putchar(x)
    using namespace std;
    char RR[50000005],*S=RR;
    const int M=1010;
    inline int g() {
        R ret=0; register char ch; while(!isdigit(ch=getchar())) ;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret;
    }
    int n,cnt,crt=1,pos=1;
    int s1[M],tp1,s2[M],tp2,a[M];
    char ans[M<<1];
    bool flg;
    inline bool ck(int pos) {
        if(!tp2) return true; R i;
        for(i=pos+1;i<=n;++i) if(a[i]>a[pos]&&a[i]>s2[tp2]) break;
        for(R j=i+1;j<=n;++j) if(a[j]<a[pos]) return false; return true;
    }
    signed main() {
        //freopen("in.in","r",stdin);
        fread(RR,sizeof(RR),1,stdin);
        n=g(); s2[0]=s1[0]=M<<4; //cout<<n<<endl;
        for(R i=1;i<=n;++i) a[i]=g();//,cout<<a[i]<<endl;
        for(R i=1;i<=(n<<1);++i) {
            if(pos<=n&&a[pos]<s1[tp1]&&ck(pos)) {
                s1[++tp1]=a[pos]; ans[i]='a',++pos;
            } else if(s1[tp1]==crt) {
                ++crt,--tp1; ans[i]='b'; 
            } else if(pos<=n&&a[pos]<s2[tp2]) {
                s2[++tp2]=a[pos]; ans[i]='c',++pos;
            } else if(s2[tp2]==crt) {
                ++crt,--tp2; ans[i]='d';
            } else {flg=true; break;}
        } if(flg) pc('0'); else for(R i=1;i<=(n<<1);++i) pc(ans[i]),pc(' '); pc('
    ');
    }
  • 相关阅读:
    小白的linux笔记3:对外联通——开通ssh和ftp和smb共享
    小白的linux笔记2:关于进程的基本操作
    小白的linux笔记1:CentOS 8 安装与设置
    Python+Flask+MysqL的web技术建站过程
    管理信息系统 第三部分 作业
    数据迁移
    模型分离(选做)
    密码保护
    实现搜索功能
    完成个人中心—导航标签
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10711291.html
Copyright © 2020-2023  润新知