Cod sursa(job #163685)

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

#define NMAX 5010

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

void buildSir()
{
	for (cc = M; cc >= 1; cc--)
	{
		i = ival[cc];

		if (i == 1)
			sir[1] = 1;
		else
		{
			if (poz[i][1] < poz[i][2] && poz[i][2] < poz[i][3]) // cazul 4
			{
				// 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
			{
				// 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
	ival[M = 1] = N;

	while (ival[M] > 1)
	{
		i = ival[M];
		if (poz[i][1] < poz[i][2] && poz[i][2] < poz[i][3])
		{
			M++;
			ival[M] = i - 2;
		}
		else
		{
			M++;
			ival[M] = i - 1;
		}
	}

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

	return 0;
}