Pagini recente » Cod sursa (job #456475) | Cod sursa (job #2263751) | Cod sursa (job #161490) | Cod sursa (job #281648) | Cod sursa (job #173798)
Cod sursa(job #173798)
#include <stdio.h>
#include <vector>
using namespace std;
#define NMAX 5010
#define sz size()
#define pb push_back
long int a[NMAX],i,j,k,n,m;
long int poz[NMAX][3],prec[NMAX];
long int pot[NMAX];
long int poz_m[NMAX];
long int h[NMAX];
vector<int> mic,mare,act;
void build(long int sh, long int l,long int cod)
{
long int i,pus,x,y;
if (cod==0) vector<int>().swap(mic);
else vector<int>().swap(mare);
vector<int>().swap(act);
if (l==0) return;
if (l==1) {
if (cod==0) mic.pb(sh+1);
else mare.pb(sh+1);
return;
}
if ( prec[l]==0 )
{
build(1,l-1,0);
memset(h,0,sizeof(h));
h[ poz_m[l] - 1 ] = 1;
act.resize(l);
act[ poz_m[l] - 1 ] = 1;
for (i=0,k=0;i<l;i++)
{
if (h[i]) continue;
act[i]=mic[k++];
}
if (cod==0) vector<int>().swap(mic);
else vector<int>().swap(mare);
for (i=0;i<l;i++)
act[i]+=sh;
if (cod==0) mic=act;
else mare=act;
act.resize(0);
return;
}
build(0,prec[l],0);
build(prec[l]+1,l-prec[l]-1,1);
memset(h,0,sizeof(h));
act.resize(l);
act[ poz_m[l] - 1 ] = prec[l]+1;
h[ poz_m[l] - 1 ] = 1;
x=0;y=0;
pus=0;
if (!pot[l])
{
if (poz[l][0]!=poz_m[l])
{
h[ poz[l][0]-1 ] = 1;
if (pus) {act[ poz[l][0]-1 ] = mic[0];
pus=1;}
else act[ poz[l][0]-1 ] = mare[0];
}
if (poz[l][1]!=poz_m[l])
{
h[ poz[l][1]-1 ] = 1;
if (!pus) {act[ poz[l][1]-1 ] = mic[0];
pus=1;}
else act[ poz[l][1]-1 ] = mare[0];
}
if (poz[l][2]!=poz_m[l])
{
h[ poz[l][2]-1 ] = 1;
if (!pus) {act[ poz[l][2]-1 ] = mic[0];
pus=1;}
else act[ poz[l][2]-1 ] = mare[0];
}
x=1;y=1;
}
for (i=0;x<prec[l];i++)
{
if (h[i]) continue;
act[i]=mic[x++];
}
for (;y<l-prec[l]-1;i++)
{
if (h[i]) continue;
act[i]=mare[y++];
}
for (i=0;i<l;i++) act[i]+=sh;
if (cod==0) mic=act;
else mare=act;
vector<int>().swap(act);
}
int main()
{
freopen("sortare.in","r",stdin);
freopen("sortare.out","w",stdout);
scanf("%ld",&n);
for (i=2;i<=n;i++)
{
scanf("%ld %ld %ld",&poz[i][0],&poz[i][1],&poz[i][2]);
if (poz[i][0]==poz[i][1]) poz_m[i]=poz[i][0],pot[i]=1;
else if (poz[i][2]==poz[i][1]) poz_m[i]=poz[i][1],pot[i]=1;
else if (poz[i][2]==poz[i][0]) poz_m[i]=poz[i][2],pot[i]=1;
else {pot[i]=0;poz_m[i]=poz[i][0];}
}
a[0]=0;
a[1]=1;
for (i=2;i<=n;i++)
{
a[i]=0;
if (pot[i]) j=0;
else j=1;
for (;j<=i/2;j++)
if ( a[i] < max(a[j],a[i-j-1]) + 1 )
{
a[i]=max(a[j],a[i-j-1]) + 1;
prec[i]=j;
}
}
printf("%ld\n",a[n]);
build(0,n,0);
for (i=0;i<n;i++)
printf("%ld ",mic[i]);
return 0;
}