Cod sursa(job #163483)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 22 martie 2008 13:17:12
Problema Sortare Scor 20
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasele 11-12 Marime 1.33 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define pb push_back

const int MAX = 5010;
vector<int> v;
int ans[MAX];
int A[MAX][3];
int mx = 0,n,i;
int c,p;

bool comp(int x, int y) {				// return x<y
	if ( ans[x]==n+1 && ans[y]==n+1 )
		if ( c==x )
			ans[x] = p++;
		else
			ans[y] = p++;
	if ( ans[x]==n+1 ) {
		c = x;
	} else {
		if ( ans[y]==n+1 ) 
			c = y;
	}
	return ans[x]<ans[y];
}

void qsort(vector<int> in, int d) {
	mx = max(d, mx);
	if ( in.size()<=0 )
		return ;
	vector<int> st, dr;
	int piv, n=in.size(), i;
	// choose piv
	vector<int> p;
	p.pb(in[A[n][0]]); p.pb(in[A[n][1]]); p.pb(in[A[n][2]]);
	sort(p.begin(), p.end(), comp);
	piv = p[1];
	for (i=0; i<n; ++i) {
    	if ( in[i]==piv )
	        continue;
		if ( comp(in[i],piv) ) 
			st.pb(in[i]);
		else
			dr.pb(in[i]);
    }
	qsort(st,d+1);
	qsort(dr,d+1);
	in.clear();
	int sts=st.size(), drs=dr.size();
	for (i=0; i<sts; ++i)
		in.pb(st[i]);
	in.pb(piv);
	for (i=0; i<drs; ++i)
		in.pb(dr[i]);
}

int main() {
	freopen("sortare.in" ,"r", stdin);
	scanf("%d", &n);
	for (i=2; i<=n; ++i) {
		scanf("%d%d%d", A[i], A[i]+1, A[i]+2);
		A[i][0]--; A[i][1]--; A[i][2]--;
	}

	for (i=0; i<n; ++i)
		v.pb(i), ans[i] = n+1;
	qsort(v,1);
	freopen("sortare.out","w", stdout);
	printf("%d\n", mx-1);
	for (i=0; i<n; ++i)
		printf("%d ", ans[i]+1);
	return 0;
}