Cod sursa(job #163510)

Utilizator razvi9Jurca Razvan razvi9 Data 22 martie 2008 14:23:56
Problema Sortare Scor 55
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasele 11-12 Marime 1.72 kb
#include<cstdio>
#include<vector>
int n,nr[5001],m,i,j,k,x,y,z;
std::vector<short> a[5001];
int _m(int a,int b){if(a<b) return b;return a;}
int getmax(){return _m(x,_m(y,z));}
int getmed(){
	if(x<y)
		if(y<z) return y;
		else
			if(x<z) return z;
			else return x;
	else
		if(x<z) return x;
		else
			if(y<z) return z;
			else return y;
}
int getdouble()
{
	if(x==y) return x;
	if(y==z) return y;
	return x;
}
int main()
{
	freopen("sortare.in","r",stdin);
	freopen("sortare.out","w",stdout);
	scanf("%d",&n);
	a[1].push_back(1);
	nr[1]=1;
	for(i=2;i<=n;i++){
		scanf("%d %d %d",&x,&y,&z);
		m=1;k=0;
		if(x==y && y==z){
			//un numar
			for(j=2;j<i;j++)
				if(nr[j]>nr[m]) m=j;
			x--;}
		else
			if(x==y || y==z || z==x){
				//doua numere
				x=getdouble()-1;
				for(j=2;j<i;j++)
					if(nr[j]>nr[m]) m=j;}
			else{
				//trei numere
				k=getmed();
				y=getmax()-2;
				x=k-1;
				for(j=2;j<i-1;j++)
					if(nr[j]>nr[m]) m=j;}
		nr[i]=nr[m]+1;
		if(k==0){
			for(j=0;j<x && j<m;j++)
				a[i].push_back(a[m][j]);
			k=m+2;
			if(j!=x)
				for(;j<x;j++,k++)
					a[i].push_back(k);
			a[i].push_back(m+1);
			for(;j<m;j++)
				a[i].push_back(a[m][j]);
			for(;k<=n;k++)
				a[i].push_back(k);}
		else{
			for(j=0;j<x && j<m;j++)
				a[i].push_back(a[m][j]);
			k=m+2;
			if(j!=x)
				for(;j<x;j++,k++)
					a[i].push_back(k);
			a[i].push_back(m+1);
			for(;j<m&&j<y;j++)
				a[i].push_back(a[m][j]);
			if(j!=y)
				for(;j<y;j++,k++)
					a[i].push_back(k);
			a[i].push_back(k++);
			for(;j<m;j++)
				a[i].push_back(a[m][j]);
			for(;k<=n;k++)
				a[i].push_back(k);}}
	printf("%d\n",nr[n]);
	for(i=0;i<n;i++)
		printf("%d ",a[n][i]);
	fclose(stdout);
	return 0;
}