Cod sursa(job #163524)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 22 martie 2008 14:42:02
Problema Sortare Scor 0
Compilator c Status done
Runda preONI 2008, Runda Finala, Clasele 11-12 Marime 2.86 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define NMAX 5005

int V[NMAX], N, Piv[NMAX][3], T[NMAX], Hmax, H2;

void read()
{
        int i, j, k, aux;

        scanf("%d", &N);

        for (i = 2; i <= N; i++)
        {
            scanf("%d%d%d", &Piv[i][0], &Piv[i][1], &Piv[i][2]);

            for (j = 0; j < 3; j++)
                for (k = j+1; k < 3; k++)
                    if (Piv[i][j]>Piv[i][k])
                       aux = Piv[i][j], Piv[i][j] = Piv[i][k], Piv[i][k] = aux;
        }
}

void solve(int p, int q, int l, int lev)
{
        int x;

        if (Hmax<lev) Hmax = lev;

        if (l==1) {
           V[p] = p; return; }

        x = p+Piv[l][1]-1;
        V[x] = x;

        solve(p,x-1,x-p,lev+1);
        solve(x+1,q,x-p,lev+1);
}

int st[NMAX], dr[NMAX], stiva[NMAX][2];

void sort(int v[NMAX], int n, int lev)
{
        int piv, i, l = 0, r = 0, j, k, aux;
        int x[3];

        if (lev>H2) H2 = lev;

        if (n<=1) return;

        x[0] = v[ Piv[n][0] ];
        x[1] = v[ Piv[n][1] ];
        x[2] = v[ Piv[n][2] ];

        for (j = 0; j < 3; j++)
            for (k = j+1; k < 3; k++)
                if (x[j]>x[k])
                   aux = x[j], x[j] = x[k], x[k] = aux;

        piv = x[1];

        stiva[lev][0] = stiva[lev][1] = 0;
        for (i = 1; i <= n; i++)
            if (v[i]<piv) st[++stiva[lev][0]] = v[i];
            else
                if (v[i]>piv) dr[++stiva[lev][1]] = v[i];

        sort(st,stiva[lev][0],lev+1);
        sort(dr,stiva[lev][1],lev+1);
}

void bulan()
{
        int cnt = N, i, j, max, x, v[NMAX], mark[NMAX];


        if (cnt>2000) cnt = 2000;

        srand(time(0));

        while (cnt>0)
        {
                cnt--;
                memset(mark,0,sizeof(mark));
                memset(v,0,sizeof(v));
                memset(st,0,sizeof(st));
                memset(dr,0,sizeof(dr));

                for (i = 1; i <= N; i++)
                {
                        x = 1+rand()%N;
                        while (mark[x]) x = 1+rand()%N;
                        v[i] = x;
                        mark[x] = 1;
                }

                sort(v,N,1);
                if (H2>max) {
                   max = H2;
                   for (j = 1; j <= N; j++) T[j] = v[j]; }
        }

        if (max>Hmax)
        {
                Hmax = max;
                for (i = 1; i <= N; i++) V[i] = T[i];
        }
}

void write()
{
        int i;
        printf("%d\n", Hmax);
        for (i = 1; i <= N; i++) printf("%d ", V[i]);
        printf("\n");
}

int main()
{
        freopen("sortare.in", "r", stdin);
        freopen("sortare.out", "w", stdout);

        read();
        solve(1,N,N,1);
        if (N<501) bulan();
        write();
        return 0;
}