Cod sursa(job #163513)

Utilizator devilkindSavin Tiberiu devilkind Data 22 martie 2008 14:33:20
Problema Sortare Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasa a 10-a Marime 3.52 kb
#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++];
                }
                
        vector<int>().swap(mic);

        for (i=0;i<l;i++)
                act[i]+=sh;
        mic=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;
}