Cod sursa(job #163691)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 22 martie 2008 14:58:03
Problema Sortare Scor 25
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasele 11-12 Marime 1.32 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define pb push_back

const int MAX = 5010;
int v[MAX];
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];
}

int pp[3];
int tmp[2][MAX];

void qsort(int st, int dr, int d) {
	mx = max(d, mx);
	if ( dr<st )
		return ;
	int piv, n=dr-st+1;

	// alegerea pivotului
	pp[0] = v[st+A[n][0]]; 
	pp[1] = v[st+A[n][1]]; 
	pp[2] = v[st+A[n][2]];
	sort(pp, pp+3, comp);
	piv = pp[1];

	int ss=0, dd=0, i, vp;
	for (i=st; i<=dr; ++i) {
		if ( v[i] == piv ) { vp=i; continue; }
		if ( comp(v[i],piv) ) 
			tmp[0][ss++]=v[i];
		else
			tmp[1][dd++]=v[i];
	}
	for (i=0; i<ss; ++i)
		v[st+i] = tmp[0][i];
	v[st+ss]=piv;
	for (i=0; i<dd; ++i)
		v[st+ss+1+i] = tmp[1][i];

	qsort(st,st+ss-1, d+1);
	qsort(st+ss+1,dr, d+1);
}

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[i] = i, ans[i] = n+1;
	qsort(0,n-1,1);
	
	freopen("sortare.out","w", stdout);
	printf("%d\n", mx-1);
	for (i=0; i<n; ++i)
		printf("%d ", ans[i]+1);
	return 0;
}