P1155 双栈排序
双栈排序
用双栈进行排序,也就是给出一个序列,让你用两个栈来排序,输出排序的操作类型。
实现也比较简单,如果存在一个k,使得i<j<k且a[k]<a[i]<a[j],那么i和j就不能存在一个栈中。
代码:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<stack> 4 #define N 420000 5 using namespace std; 6 int head[N],next[N],to[N],rs[N],n,a[N],f[N],num; 7 stack<int> s1,s2; 8 void add(int x,int y){ 9 next[++num]=head[x]; 10 to[num]=y; 11 head[x]=num; 12 } 13 int dfs(int x,int c){ 14 rs[x]=c; 15 for(int y,i=head[x];i;i=next[i]){ 16 y=to[i]; 17 if(rs[y]==rs[x]){ 18 printf("0"); 19 exit(0); 20 } 21 if(!rs[y]) 22 dfs(y,-c); 23 } 24 } 25 int main(){ 26 scanf("%d",&n); 27 for(int i=1;i<=n;++i) 28 scanf("%d",&a[i]); 29 f[n+1]=N; 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 add(i,j); 35 add(j,i); 36 } 37 } 38 for(int i=1;i<=n;++i){ 39 if(!rs[i]){ 40 dfs(i,1); 41 } 42 } 43 int aim=1; 44 for(int i=1;i<=n;i++){ 45 if(rs[i]==1){ 46 printf("a "); 47 s1.push(a[i]); 48 } 49 else{ 50 printf("c "); 51 s2.push(a[i]); 52 } 53 while((!s1.empty()&&s1.top()==aim)||(!s2.empty()&&s2.top()==aim)){ 54 if(!s1.empty()&&s1.top()==aim){ 55 s1.pop(); 56 printf("b "); 57 aim++; 58 } 59 else{ 60 s2.pop(); 61 printf("d "); 62 aim++; 63 } 64 } 65 } 66 return 0; 67 }