Cod sursa(job #163615)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 22 martie 2008 14:49:35
Problema Sortare Scor 5
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasa a 10-a Marime 1.58 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define maxn 5010
#define stop 900000
#define max(a,b) (a > b ? a : b)

int n,m;
int A[maxn];
int sol,rez;
int x[maxn],y[maxn],z[maxn];
int a[maxn],u[maxn],s[maxn];
int v[maxn],b[maxn];

int part(int p,int r)
{
	int i = p-1, j, aux = r-p+1;
	v[0] = b[p+x[aux]-1], v[1] = b[p+y[aux]-1], v[2] = b[p+z[aux]-1];

	sort(v,v+3);
	int x = v[1];

	for (j=p;j<=r;j++)
		if (b[j] <= x)
		{
			i++;
			aux = b[i];
			b[i] = b[j];
			b[j] = aux;
		}

	return i;
}

int qsort(int p,int r)
{
	if (p<r) 
	{
		 int q = part(p,r);
		 int v1 = qsort(p,q-1);
		 int v2 = qsort(q+1,r);
		 return max(v1,v2) + 1;
	}
	return 1;
}

void check()
{
	int i;
	for (i=1;i<=n;i++) b[i] = a[i];

	rez = qsort(1,n);

	if (rez > sol) 
	{
		sol = rez;
		for (i=1;i<=n;i++) s[i] = a[i];
	}
}

void back(int k)
{
	if (k>n) check();
	else {
	        int i;
			for (i=1;i<=n;i++)
				if (!u[i]) 
				{
					u[i] = 1;
					a[k] = i;
					back(k+1);
					u[i] = 0;
				}
		 }
}

void permgen()
{
	int t,i,x;

	srand(29041989);
	for (i=1;i<=n;i++) a[i] = i;
	check();

	for (i=n;i>0;i--) a[i] = n-i+1;
	check();


	for (t=1;t*n<=stop;t++)
	{
		for (i=0;i<n;i++) A[i] = i+1;
		m = n;

		for (i=1;i<=n;i++)
		{
			x = rand()%m;
			a[i] = A[x];
			m--;
			A[x] = A[m];
		}

		check();
	}
}

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

	scanf("%d ",&n);

	int i;

	for (i=2;i<=n;i++) scanf("%d %d %d ",&x[i],&y[i],&z[i]);

	if (n <= 10) back(1);
	else permgen();

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

	return 0;
}