Cod sursa(job #163625)

Utilizator tudalexTudorica Constantin Alexandru tudalex Data 22 martie 2008 14:49:52
Problema Sortare Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasa a 10-a Marime 1.4 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

const int n_max = 5009;

int p[n_max][4],
	s[8],
	sol[n_max],
	r[2][n_max];
int i, n, hmax, k, pre, j, c; 
int main()
{
	freopen("sortare.in","r",stdin);
	freopen("sortare.out","w",stdout);
	scanf("%d", &n);
	for (i = 2; i <= n; ++ i)
	{
		scanf("%d %d %d", &s[1], &s[2], &s[3]);
		sort(s+1, s+4);
		if (s[1] == s[2] && s[2] == s[3])
		{
			p[i][0] = 1;
			p[i][1] = s[1];
		}
		else
		if (s[1] == s[2])
		{
			p[i][0] = 2;
			p[i][1] = s[1];
			p[i][2] = s[3];
		}
		else
		if (s[2] == s[3])
		{
			p[i][0] = 2;
			p[i][1] = s[2];
			p[i][2] = s[1];
		}
		else
		{
			p[i][0] = 3;
			p[i][1] = s[1];
			p[i][2] = s[2];
			p[i][3] = s[3];
		}
	}
	k = n;
	while (k > 1)
	{
		++hmax;
		if (p[k][0] == 1)
		{
			sol[++sol[0]] = 1;
			k-=1;
			
		}
		else
		{
			sol[++sol[0]] = p[k][0]-1;
			k-=p[k][0]-1;
			
		}
		
	}
	printf("%d\n", hmax+1);
	// Reconstituirea 
	if (k == 1)
	{
		r[0][1] = 1;
	}
	c = 1;
	pre = 1-c;

	for (i = 1; i <= sol[0]; ++ i)
	{
		k+=sol[i];
		memset(r[c], 0, sizeof(r[c]));
		for (j = 1; j <= p[k][0]-1; ++ j)
		{
			r[c][p[k][j]] = k-j+1;
		}
		int o = 0;
		for (j = 1; j <= k; ++ j)
			if (r[c][j] == 0)
			{
				r[c][j] = r[pre][++o];
			}
		pre = c;
		c = 1-c;
	}
	for (i = 1; i <=n; ++ i)
		printf("%d ", r[pre][i]);
	printf("\n");
	return 0;
}