Cod sursa(job #2557930)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 26 februarie 2020 09:50:46
Problema Bibel Scor 100
Compilator cpp-64 Status done
Runda sim11_1 Marime 2.44 kb
#include <fstream>

using namespace std;
long long mlc,n,m,i,j,nr,val,p,mini,x[20],y[20],x2[20],y2[20],b[20],d[20][250005];
int main()
{
    ifstream f("bibel.in");
    ofstream g("bibel.out");
    while(f>>mlc)
    {
        if(mlc==2) return 0;
        if(mlc==0)
        {
            n++;
            f>>x[n]>>y[n];
        }
        else
        {
            for(i=1; i<=n; i++)
            {
                b[i]=d[1][val]+(x[i]-x2[1])*(x[i]-x2[1])+(y[i]-y2[1])*(y[i]-y2[1]);
                for(j=2; j<=m; j++)
                {
                    b[i]=min(b[i],d[j][val]+(x[i]-x2[j])*(x[i]-x2[j])+(y[i]-y2[j])*(y[i]-y2[j]));
                }
            }
            for(i=1; i<=m; i++)
            for(j=1; j<=val; j++) d[i][j]=0;
            p=1;
            for(i=n; i>=1; i--)
            {
                d[i][p]=b[i];
                b[i]=0;
                p*=2;
            }
            b[n]=1;
            val=1;
            nr=1;
            while(b[0]==0)
            {
                if(nr>1)
                {
                    i=n;
                    p=1;
                    while(i)
                    {
                        if(b[i]==1)
                        {
                            d[i][val]=-1;
                            b[i]=0;
                            for(j=1; j<=n; j++)
                            {
                                if(b[j]==1&&(d[i][val]==-1||d[i][val]>d[j][val-p]+(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])))
                                d[i][val]=d[j][val-p]+(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
                            }
                            b[i]=1;
                        }
                        i--;
                        p*=2;
                    }
                }
                i=n;
                while(b[i])
                {
                    b[i]=0;
                    nr--;
                    i--;
                }
                nr++;
                b[i]=1;
                val++;
            }
            b[0]=0;
            val--;
            mini=d[1][val];
            for(i=2; i<=n; i++) mini=min(mini,d[i][val]);
            g<<mini<<'\n';
            for(i=1; i<=n; i++)
            {
                x2[i]=x[i];
                y2[i]=y[i];
                x[i]=0;
                y[i]=0;
            }
            m=n;
            n=0;
        }
    }
    return 0;
}