Cod sursa(job #163427)

Utilizator mugurelionutMugurel-Ionut Andreica mugurelionut Data 22 martie 2008 10:58:33
Problema Sortare Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasele 11-12 Marime 2.53 kb
#include <stdio.h>

#define NMAX 5010

int /*v[NMAX][4],*/ poz[NMAX][4], hmax[NMAX], sir[NMAX];
int i, j, k, vaux, N;

void buildSir(int i)
{
	if (i == 1)
		sir[1] = 1;
	else
	{
		if (poz[i][1] < poz[i][2] && poz[i][2] < poz[i][3]) // cazul 4
		{
			buildSir(i - 2);

			// extinde sirul pentru i-2 la sirul pentru i
			for (j = i - 1; j >= poz[i][2] + 1; j--)
				sir[j] = sir[j - 1];
			sir[poz[i][2]] = i - 1;

			for (j = i; j >= poz[i][3] + 1; j--)
				sir[j] = sir[j - 1];
			sir[poz[i][3]] = i;
		}
		else // cazurile 1, 2, 3
		{
			buildSir(i - 1);

			// extinde sirul pentru i-1 la sirul pentru i
			if (poz[i][1] == poz[i][2] && poz[i][2] == poz[i][3]) // cazul 1
			{
				for (j = i; j >= poz[i][1] + 1; j--)
					sir[j] = sir[j - 1];
				sir[poz[i][1]] = i;
			}
			else
			if (poz[i][1] == poz[i][2] && poz[i][2] < poz[i][3]) // cazul 2
			{
				for (j = i; j >= poz[i][2] + 1; j--)
					sir[j] = sir[j - 1];
				sir[poz[i][2]] = i;
			}
			else
			if (poz[i][1] < poz[i][2] && poz[i][2] == poz[i][3]) // cazul 3
			{
				for (j = i; j >= poz[i][2] + 1; j--)
					sir[j] = sir[j - 1];
				sir[poz[i][2]] = i;
			}	
		}
	}
}

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

	scanf("%d", &N);

	poz[1][1] = poz[1][2] = poz[1][3] = 3;

	for (i = 2; i <= N; i++)
		scanf("%d %d %d", &poz[i][1], &poz[i][2], &poz[i][3]);

	hmax[0] = 0;
	/*v[1][1] = v[1][2] = v[1][3] = */hmax[1] = 1;

	for (i = 2; i <= N; i++)
	{
		// sorteaza pozitiile pentru lungimea i
		for (j = 1; j < 3; j++)
			for (k = j + 1; k <= 3; k++)
				if (poz[i][j] > poz[i][k])
				{
					vaux = poz[i][j];
					poz[i][j] = poz[i][k];
					poz[i][k] = vaux;
				}

		if (poz[i][1] == poz[i][2] && poz[i][2] == poz[i][3]) // cazul 1
		{
			//v[i][1] = v[i][2] = v[i][3] = i;
			hmax[i] = hmax[i - 1] + 1;
		}
		else
		if (poz[i][1] == poz[i][2] && poz[i][2] < poz[i][3]) // cazul 2
		{
			//v[i][1] = v[i][2] = i;
			//v[i][3] = 1;
			hmax[i] = hmax[i - 1] + 1;
		}
		else
		if (poz[i][1] < poz[i][2] && poz[i][2] == poz[i][3]) // cazul 3
		{
			//v[i][1] = 1;
			//v[i][2] = v[i][3] = i;
			hmax[i] = hmax[i - 1] + 1;
		}
		else
		if (poz[i][1] < poz[i][2] && poz[i][2] < poz[i][3]) // cazul 4
		{
			//v[i][1] = 1;
			//v[i][2] = i - 1;
			//v[i][3] = i;
			hmax[i] = hmax[i - 2] + 1;
		}
	}

	freopen("sortare.out", "w", stdout);
	printf("%d\n", hmax[N]);

	// reconstituie sirul
	buildSir(N);
    
	for (i = 1; i < N; i++)
		printf("%d ", sir[i]);
	printf("%d\n", sir[N]);

	return 0;
}