1. 程式人生 > >P1155 雙棧排序

P1155 雙棧排序

sta stack log print hide lan pre sin target

雙棧排序

洛谷鏈接

用雙棧進行排序,也就是給出一個序列,讓你用兩個棧來排序,輸出排序的操作類型。

實現也比較簡單,如果存在一個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 }
View Code

P1155 雙棧排序