Cod sursa(job #2644569)

Utilizator loraclorac lorac lorac Data 24 august 2020 22:33:10
Problema Sortare Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("sortare.in");
ofstream out("sortare.out");
int a[5005],b[5005],c[5005];
int hmax[5005],val[5005];
vector<int> solve(int dim,int add)
{
    vector<int> v(dim+1);
    if(dim==1) {v[1]=add+1;return v;}
    vector<int> st=solve(val[dim]-1,add);
    vector<int> dr=solve(dim-val[dim],add+val[dim]);
    int unde=1,ind=1;
    for(int i=1;i<=dim;++i)
    {
        if(i==b[dim]) {v[i]=add+val[dim];continue;}
        if(unde==1)
        {
            v[i]=st[ind];
            ++ind;
            if(ind>val[dim]-1)
                unde=2,ind=1;
        }
        else if(unde==2)
        {
            v[i]=dr[ind];
            ++ind;
        }
    }
    return v;
}
int main()
{
    int n;
    in>>n;
    vector<int> srt;
    for(int i=2;i<=n;++i)
    {
        in>>a[i]>>b[i]>>c[i];
        srt.clear();
        srt.push_back(a[i]);
        srt.push_back(b[i]);
        srt.push_back(c[i]);
        sort(srt.begin(),srt.end());
        a[i]=srt[0],b[i]=srt[1],c[i]=srt[2];
    }
    hmax[1]=1;
    for(int i=2;i<=n;++i)
    {
        int rep=-1;
        if(a[i]==b[i])
            rep=a[i];
        else if(a[i]==c[i])
            rep=c[i];
        else if(b[i]==c[i])
            rep=b[i];
        if(rep!=-1)
        {
            for(int j=1;j<=i;++j)
            {
                //hmax[i]=max(hmax[i],1+max(hmax[j-1],hmax[i-j]));
                if(1+max(hmax[j-1],hmax[i-j])>hmax[i])
                {
                    val[i]=j;
                    hmax[i]=1+max(hmax[j-1],hmax[i-j]);
                }
            }
        }
        else
        {
            for(int j=2;j<i;++j)
            {
                //hmax[i]=max(hmax[i],1+max(hmax[j-1],hmax[i-j]));
                if(1+max(hmax[j-1],hmax[i-j])>hmax[i])
                {
                    val[i]=j;
                    hmax[i]=1+max(hmax[j-1],hmax[i-j]);
                }
            }
        }
    }
    out<<hmax[n]<<'\n';
    vector<int> ans=solve(n,0);
    for(int i=1;i<=n;++i)
        out<<ans[i]<<' ';
    return 0;
}