Cod sursa(job #163485)

Utilizator blasterzMircea Dima blasterz Data 22 martie 2008 13:19:55
Problema Sortare Scor 5
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasele 11-12 Marime 1.53 kb
using namespace std;
#include <algorithm>
using namespace std;
#include <cstdio>
#include <string>
#include <algorithm>
#define maxn 5001

int a[maxn], b[maxn], c[maxn];
int n;
int x[maxn],A[maxn];
bool use[maxn];
int hmax;

void read()
{
    freopen("sortare.in","r",stdin);
    scanf("%d\n", &n);
    for(int i=2;i<=n;++i) scanf("%d %d %d\n", &a[i], &b[i], &c[i]);
}
inline void swap(int i, int j)
{
    int t=A[i];A[i]=A[j];A[j]=t;
}
int ax[maxn];

inline void qsort(int l,int r,int h)
{
    if(hmax<h)hmax=h;
    if(l>=r)return;
    int i,j,piv;//+rand()%(li-ls)+1;
    int s[4];
    s[0]=A[l+a[r-l+1]-1];
    s[1]=A[l+b[r-l+1]-1];
    s[2]=A[l+c[r-l+1]-1];

       //if(l==1 && r==n)
      // 	printf("%d %d %d\n", s[0],s[1],s[2]);
    sort(s,s+3);
    piv=s[1];
   
   int st=l-1;
   int dr=r+1;
    for(int x=l;x<=r;++x)
	if(A[x]<piv) ax[++st]=A[x];
	else if(A[x]>piv) ax[--dr]=A[x];

    for(int x=l;x<=r;++x) A[x]=ax[x];
    qsort(l, st, h+1);
    qsort(dr+1, r, h+1);

   
       
}

void solve()
{
    int i;
    int H=0;
    int sol[maxn];
    for(i=1;i<=n;++i) x[i]=i;
    do
    {
	for(i=1;i<=n;++i) A[i]=x[i];
	hmax=0;
	qsort(1,n,1);
	if(H<hmax) 
	{
	    H=hmax;
	    for(i=1;i<=n;++i) sol[i]=x[i];
	}
    }while(next_permutation(x+1,x+n+1));	

    printf("%d\n", H);
    for(i=1;i<=n;++i)printf("%d ", sol[i]);
    printf("\n");

    /*
    printf("\n");
    for(i=1;i<=n;++i) A[i]=sol[i];
    hmax=0;
    qsort(1,n,1);
    printf("%d\n", hmax);
*/
 }

int main()
{
    freopen("sortare.out","w",stdout);
    read();
    solve();
    return 0;
}