首先可以看出第一个栈和第二个栈是没什么交集的,那么第一步是对这些元素分别归到两个栈里,
当存在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 }
因为看别人代码写的,所以比较类似。