Cod sursa(job #171430)

Utilizator damaDamaschin Mihai dama Data 4 aprilie 2008 12:45:16
Problema Sortare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#include <string.h>

const int nm = 5010;

inline void swap(int& a, int& b)
{
	if(a > b)
	{
		int temp;
		temp = a;
		a = b;
		b = temp;
	}
}

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

	int crt[nm], prev1[nm], prev2[nm], sol[nm], n, l, i, j, temp;
	int a, b, c;

	memset(crt, 0, sizeof(crt));
	memset(prev1, 0, sizeof(prev1));
	memset(prev2, 0, sizeof(prev2));
	memset(sol, 0, sizeof(sol));

	prev1[1] = 1;
	sol[1] = sol[0] = 1;

	scanf("%d", &n);

	for(l = 2; i <= n; ++l)
	{
		scanf("%d %d %d", &a, &b, &c);
		swap(a, b);
		swap(b, c);
		swap(a, b);

		if(a == b || b == c)
		{
			sol[l] = sol[l - 1] + 1;
			crt[b] = 1;
			for(i = 1, temp = 0; i <= l; ++i)
			{
				if(!crt[i])
				{
					crt[i] = prev1[++temp] + 1;
				}
			}
		}
		else
		{
			sol[l] = sol[l - 2] + 1;
			crt[a] = 1;
			crt[b] = 2;
			for(i = 1, temp = 0; i <= l; ++i)
			{
				if(!crt[i])
				{
					crt[i] = prev2[++temp] + 2;
				}
			}
		}
		/*
		for(i = 1; i <= l; ++i)
		{
			printf("%d ", crt[i]);
		}
		printf("\n");
		*/
		memcpy(prev2, prev1, sizeof(prev1));
		memcpy(prev1, crt, sizeof(crt));
		memset(crt, 0, sizeof(crt));
	}

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

	return 0;
}