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('\n'); }