Cod sursa(job #163780)

Utilizator alextheroTandrau Alexandru alexthero Data 23 martie 2008 10:21:39
Problema Sortare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.9 kb
#include <stdio.h>
#include <algorithm>
#include <vector>

#define nmax 5005
#define inf 0x3f3f3f3f
#define pb push_back
#define min(i,j) ((i) > (j) ? (j) : (i))
#define max(i,j) ((i) > (j) ? (i) : (j))

using namespace std;

int n, lungime = 0;
int a[nmax], b[nmax], c[nmax];
int d[nmax], piv[nmax];
vector <int> rez;

vector <int> reconst(int first, int last)
{
	int l = last - first + 1;
	vector <int> crt, st, dr;
	crt.clear();
	if(l == 0) return crt;
	else if(l == 1) crt.pb(first);
	else if(l == 2) 
	{
		for(int i = first; i <= last; i++) crt.pb(i);	
	}
	else
	{
		if(first + piv[l] - 2 >= first) st = reconst(first, first + piv[l] - 2);
		if(first + piv[l] <= last) dr = reconst(first + piv[l], last);

		for(int i = first; i <= last; i++) crt.pb(0);
		crt[b[l] - 1] = first + piv[l] - 1;
		int lp = l - 1;
		if(st.size() == 0)
		{
			int lp = 0;
			for(int i = 0; i < (int)dr.size(); i++)
			{
				while(crt[lp] != 0) lp++;
				crt[lp] = dr[i];
			}
		}
		else if(dr.size() == 0)
		{
			int lp = 0;
			for(int i = 0; i < (int)st.size(); i++)
			{
				while(crt[lp] != 0) lp++;
				crt[lp] = st[i];
			}
		}
		else
		{
			for(int i = (int)st.size() - 1; i > 0; i--)
			{
				while(crt[lp] != 0 || lp == c[l] - 1) lp--;
				crt[lp] = st[i];
			}
			if(lp > a[l] - 1 && crt[a[l] - 1] == 0) crt[a[l] - 1] = st[0];
			else 
			{
				while(crt[lp] != 0 || lp == c[l] - 1) lp--;
				crt[lp] = st[0];
			}

			lp = 0;
			for(int i = 0; i < (int)dr.size(); i++)
			{
				while(crt[lp] != 0) lp++;
				crt[lp] = dr[i];
			}
		}
	}

	return crt;
}

int mediana(vector <int> A, int x, int y, int z)
{
	int v1 = A[x], v2 = A[y], v3 = A[z];
	if(v1 > v2) swap(v1, v2);
	if(v1 > v3) swap(v1, v3);
	if(v2 > v3) swap(v2, v3);
	return v2;
}

vector <int> verif(vector <int> A, int niv)
{
	if(niv > lungime) lungime = niv;
	if(A.size() <= 1) return A;
	else
	{
		int l = A.size();
		int piv = mediana(A, a[l] - 1, b[l] - 1, c[l] - 1);
		vector <int> st, dr;
		for(int i = 0; i < (int)A.size(); i++)
			if(A[i] < piv) st.pb(A[i]);
			else if(A[i] > piv) dr.pb(A[i]);
		st = verif(st, niv + 1);
		dr = verif(dr, niv + 1);
		A.clear();
		for(int i = 0; i < (int)st.size(); i++) A.pb(st[i]);
		A.pb(piv);
		for(int i = 0; i < (int)dr.size(); i++) A.pb(dr[i]);
		return A;
	}
}

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

	scanf("%d", &n);
	for(int i = 2; i <= n; i++) 
	{
		scanf("%d%d%d", &a[i], &b[i], &c[i]);
		if(a[i] > b[i]) swap(a[i], b[i]);
		if(a[i] > c[i]) swap(a[i], c[i]);
		if(b[i] > c[i]) swap(b[i], c[i]);
	}

	d[1] = 1, d[2] = 2;
	for(int i = 3; i <= n; i++)
	{
		d[i] = 0;
		if(a[i] == b[i] || a[i] == c[i] || b[i] == c[i]) d[i] = d[i - 1] + 1, piv[i] = 1;
		for(int j = 2; j < i; j++) 
			if(max(d[j - 1], d[i - j]) + 1 > d[i]) 
				d[i] = max(d[j - 1], d[i - j]) + 1, piv[i] = j;
	}

	printf("%d\n", d[n]); 
	rez = reconst(1, n);
	for(int i = 0; i < (int)rez.size(); i++) printf("%d ", rez[i]); printf("\n");
	
	return 0;
}