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('
');
}
原文地址:https://www.cnblogs.com/Jackpei/p/10711291.html