Cod sursa(job #2641548)

Utilizator loraclorac lorac lorac Data 11 august 2020 21:51:04
Problema Bibel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("bibel.in");
ofstream out("bibel.out");
typedef long long ll;
const ll inf=9e18;
struct Op
{
    ll x;
    ll y;
    ll ans;
};
vector<Op> last;
struct per
{
    ll x;
    ll y;
};
vector<per> v;
ll dp[18][(1<<17)];
ll term[18];
ll dist(ll x,ll y,ll xx,ll yy)
{
    return (xx-x)*(xx-x)+(yy-y)*(yy-y);
}
vector<ll> used;
int main()
{
    ll t,x,y;
    last.push_back({0,0,0});
    while(in>>t)
    {
        if(t==2) return 0;
        if(t==0)
        {
            in>>x>>y;
            v.push_back({x,y});
            continue;
        }
        ll n=v.size();
        for(ll i=0;i<n;++i)
            dp[i][(1<<i)]=term[i]=inf;
        for(auto f:last)
        for(ll i=0;i<n;++i)
            dp[i][(1<<i)]=min(dp[i][(1<<i)],f.ans+dist(f.x,f.y,v[i].x,v[i].y));
        for(ll k=1;k<(1<<n);++k)
        {
            used.clear();
            ll mask=k;
            for(ll i=0;i<n;++i)
            {
                if(mask&1) used.push_back(i);
                mask>>=1;
            }
            if(used.size()==1) continue;
            for(auto a:used)
            {
                dp[a][k]=inf;
                ll apel=k-(1<<a);
                for(auto b:used) if(a!=b)
                    dp[a][k]=min(dp[a][k],dp[b][apel]+dist(v[b].x,v[b].y,v[a].x,v[a].y));
            }
        }
        for(ll i=0;i<n;++i)
            term[i]=min(term[i],dp[i][(1<<n)-1]);
        ll nivel=inf;
        for(ll i=0;i<n;++i)
            nivel=min(nivel,term[i]);
        out<<nivel<<'\n';
        last.clear();
        for(ll i=0;i<n;++i)
            last.push_back({v[i].x,v[i].y,term[i]});
        v.clear();
    }
    return 0;
}