Cod sursa(job #163620)

Utilizator gcosminGheorghe Cosmin gcosmin Data 22 martie 2008 14:49:37
Problema Sortare Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasele 11-12 Marime 2.82 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

#define NMAX 5010

int N;

vector <int> poz[NMAX];
int npoz[NMAX];
int lmax[NMAX];
int sol[NMAX];

vector <int> pp[NMAX];

int *perm[NMAX];

inline int MAX(int a, int b) { return (a > b) ? a : b; }

void rec_sol(int N) 
{
	if (N <= 1) return;

	int q = sol[N], w = N - q - 1;

	if (q > w) { rec_sol(q); rec_sol(w); }
	else { rec_sol(w); rec_sol(q); }

	free(perm[N]);
	perm[N] = (int *) malloc((N + 1) * sizeof(int));

	int i, j;
	for (i = 1; i <= N; i++) perm[N][i] = 0;

	perm[N][poz[N][0]] = q + 1;

	for (i = 1, j = 1; i <= N && j < q; i++) {
		if (perm[N][i]) continue;
		perm[N][i] = perm[q][j++];
	}

	if (npoz[N] >= 2 && !perm[N][ poz[N][1] ] && q) perm[N][ poz[N][1] ] = perm[q][j++];

	for (; i <= N && j <= q; i++) {
		if (perm[N][i]) continue;
		perm[N][i] = perm[q][j++];
	}

	for (i = 1, j = 1; i <= N; i++) {
		if (perm[N][i]) continue;
		perm[N][i] = perm[w][j++] + q + 1;
	}

//	printf("%d - %d %d\n", N, q, w);
//	for (i = 1; i <= N; i++) printf("%d ", perm[N][i]);
//	printf("\n");

	if (q != 1) free(perm[q]); 
	if (w != 1) free(perm[w]);
}
/*
int gen(int N)
{
	freopen("sortare.in", "w", stdout);

	printf("%d\n", N);

	int i, j;
	for (i = 2; i <= N; i++) {
		for (j = 1; j <= 3; j++) printf("%d ", rand() % i + 1);
		printf("\n");
	}

	fclose(stdout);

	return 0;
}
*/

/*
int lvl = 0;

void sort(vector <int> a, int lv)
{
	if (lv > lvl) lvl = lv;

	int n = a.size(), i;

	if (n <= 1) return;
	
	vector <int> b, c;

	vector <int> jeg;
	for (int i = 0; i < 3; i++) jeg.push_back(a[ pp[n][i] - 1 ]);
	sort(jeg.begin(), jeg.end());
	int p = jeg[1];

	for (i = 0; i < n; i++) if (a[i] < p) b.push_back(a[i]);
	for (i = 0; i < n; i++) if (a[i] > p) c.push_back(a[i]);

	sort(b, lv + 1);
	sort(c, lv + 1);
}
*/
int main()
{
	int i, j, q, x, y;

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

	scanf("%d", &N);

	for (i = 2; i <= N; i++) {
		for (j = 1; j <= 3; j++) {
			scanf("%d", &q);
	
			poz[i].push_back(q);
			pp[i].push_back(q);
		}

		sort(poz[i].begin(), poz[i].end());
		poz[i].resize(unique(poz[i].begin(), poz[i].end()) - poz[i].begin());
		npoz[i] = poz[i].size();

		if (npoz[i] == 2) {
			for (j = 0, q = 0; j < 3; j++) if (pp[i][j] == poz[i][1]) q++;
			if (q == 2) swap(poz[i][0], poz[i][1]);
		}
	}

	lmax[1] = 1;
	
	for (i = 2; i <= N; i++) {
		if (npoz[i] <= 2) x = 0, y = i - 1;
		else x = 1, y = i - 2;

		for (j = x; j <= y; j++) {
			q = MAX(lmax[j], lmax[i - j - 1]) + 1;

			if (q > lmax[i]) lmax[i] = q, sol[i] = j;
		}
	}

	perm[1] = (int *) malloc(2 * sizeof(int));
	perm[1][1] = 1;

	rec_sol(N);

	printf("%d\n", lmax[N]);

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

/*	vector <int> jeg;
	for (i = 1; i <= N; i++) jeg.push_back(perm[N][i]);
	sort(jeg, 1);
	printf("%d %d\n", lvl, lmax[N]);
*/
return 0;
}