Cod sursa(job #3001083)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 13 martie 2023 11:00:11
Problema Bibel Scor 10
Compilator cpp-64 Status done
Runda simusimumeu Marime 1.69 kb
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)((a<b)?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define bminify(a,b)a=bmin(a,b)
#define bmaxify(a,b)a=bmax(a,b)
#define forq(i,ii,n)for(i=ii;i<n;i++)
using namespace std;
typedef long long ll;
#define mod 1000000009
ifstream in("bibel.in");
ofstream out("bibel.out");
ll n,m,a[1<<17][17],c0[17][3],n0=1,c[17][2],d[17][17],i,j,k,x,s,v[17],u;
int main()
{
for(i=0;i<(1<<17);i++)
    for(j=0;j<17;j++)a[i][j]=LLONG_MAX;
while(true)
{
    in>>x;
    if(x==0)
        in>>c[n][0]>>c[n][1],++n;
        else if(x==1)
        {
            for(i=0;i<n;i++)
            {
                s=LLONG_MAX;
                for(j=0;j<n0;j++)
                    bminify(s,c0[j][2]+(c[i][0]-c0[j][0])*(c[i][0]-c0[j][0])+(c[i][1]-c0[j][1])*(c[i][1]-c0[j][1]));
                a[1<<i][i]=s;
                for(j=0;j<n;j++)d[i][j]=(c[i][0]-c[j][0])*(c[i][0]-c[j][0])+(c[i][1]-c[j][1])*(c[i][1]-c[j][1]);
            }
            for(i=1;i<(1<<n)-1;i++)
            {
                u=0;
                for(j=0;j<n;j++)if((i&(1<<j))!=0)v[u++]=j;
                for(j=0;j<n;j++)
                    if((i&(1<<j))==0)
                {
                    for(k=0;k<u;k++)bminify(a[i|(1<<j)][j],a[i][v[k]]+d[j][v[k]]);
                }
                for(k=0;k<u;k++)a[i][v[k]]=LLONG_MAX;
            }
            i=(1<<n)-1,n0=n,s=LLONG_MAX;
            for(j=0;j<n;j++)c0[j][0]=c[j][0],c0[j][1]=c[j][1],c0[j][2]=a[i][j],bminify(s,a[i][j]);
            out<<s<<'\n';
            //break;
        }
            else break;
}
}