Cod sursa(job #2641547)

Utilizator loraclorac lorac lorac Data 11 august 2020 20:29:58
Problema Bibel Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 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)
            term[i]=inf;
        for(auto f:last)
        {
            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)
                {
                    dp[used[0]][k]=f.ans+dist(f.x,f.y,v[used[0]].x,v[used[0]].y);
                    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;
}