Cod sursa(job #314272)

Utilizator danni_1107Sengher Daniel danni_1107 Data 10 mai 2009 23:30:01
Problema Sortare Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <cstdio>   
const int NMAX=5001;   
int N,h,A[NMAX],B[NMAX],C[NMAX],x[NMAX];   
void read(){   
     scanf("%d",&N);   
     for (int i=2;i<=N;++i) scanf("%d %d %d",&A[i],&B[i],&C[i]);   
     }   
int mediana(int x,int y,int z){   
    if ((y<=x && x<=z)||(z<=x && x<=y)) return x;   
    if ((x<=y && y<=z)||(z<=y && y<=x)) return y;   
    if ((x<=z && z<=y)||(y<=z && z<=x)) return z;   
}   
void qsort(int ls,int ld,int k){   
     if (k>h) h=k;   
     int i,n=ld-ls+1,pivot=mediana(x[A[n]+ls-1],x[B[n]+ls-1],x[C[n]+ls-1]);   
     if (n<=1) return;   
     int st[NMAX],dr[NMAX],ns,nd;   
     for (i=ls,ns=nd=0;i<=ld;++i)   
       if (x[i]<pivot) st[++ns]=x[i];   
        else if (x[i]>pivot) dr[++nd]=x[i];   
     for (i=1;i<=ns;++i) x[ls+i-1]=st[i];   
     x[ls+ns]=pivot;   
     for (i=1;i<=nd;++i) x[ls+ns+i]=dr[i];   
     qsort(ls,ls+ns-1,k+1);   
     qsort(ls+ns+1,ld,k+1);   
     }   
void write(){   
     int y[NMAX];   
     for (int i=1;i<=N;++i) y[i]=x[i];   
     qsort(1,N,1);   
     printf("%d\n",h);   
     for (int i=1;i<=N;++i) printf("%d ",y[i]);   
     }   
void solve(int n){   
     int i,med;   
     //++h;        
     if (n==1) {x[1]=1;return;}   
     if (A[n]!=B[n] && B[n]!=C[n] && C[n]!=A[n]){   
       solve(n-2);   
       if (B[n]==n) x[n-1]=n-1;   
       else{   
       for (i=n-1;i>B[n];i--) x[i]=x[i-1];   
       x[B[n]]=n-1;}   
       for (i=n;i>C[n];i--) x[i]=x[i-1];   
       x[C[n]]=n;   
       }   
     else{   
       if (A[n]==B[n] || A[n]==C[n]) med=A[n];   
        else med=B[n];   
       solve(n-1);   
       for (i=n;i>med;i--) x[i]=x[i-1];   
       x[med]=n;}   
     }        
int main(){   
    freopen("sortare.in","r",stdin);   
    freopen("sortare.out","w",stdout);   
    read();   
    solve(N);   
    write();   
    return 0;   
}