Cod sursa(job #2973134)

Utilizator gabriel10tm@gmail.comGabriel Marian [email protected] Data 31 ianuarie 2023 08:57:59
Problema Bibel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <bits/stdc++.h>
#define ll int64_t
using namespace std;
#if 1
ifstream fin("bibel.in");
ofstream fout("bibel.out");
#define cin fin
#define cout fout
#endif // 0
const int nmx = 19;
const int mskmx = 1 << 19;
ll a[nmx][nmx];
ll dp[1<<nmx][nmx];
const ll inf = 1e17;
int dist(array<int,2> p0,array<int,2> p1){
    array<int,2> d = {p1[0]-p0[0],p1[1]-p0[1]};
    return d[0]*d[0] + d[1]*d[1];
}

vector<vector<array<int,2>>> niv(1);

void resetDP(){
    for(int i=0;i<mskmx;i++)
        for(int j=0;j<nmx;j++)
            dp[i][j] = inf;
}

int main(){
    while(true){
        int op;
        cin >> op;
        if(op == 2)
            break;
        else if(op == 1){
            niv.push_back({});
            continue;
        }
        int x,y;
        cin >> x >> y;
        niv.back().push_back({x,y});
    }
    niv.pop_back();

    for(int h=0;h<niv.size();h++){
        if(h){
            vector<ll> last(niv[h-1].size());
            const int mskn = 1 << last.size();
            for(int i=0;i<last.size();i++){
                last[i] = dp[mskn-1][i];
            }
            resetDP();
            for(int i=0;i<niv[h].size();i++)
                for(int j=0;j<last.size();j++)
                    dp[1<<i][i] = min(dp[1<<i][i],last[j] + dist(niv[h-1][j],niv[h][i]));
        }
        else {
            resetDP();
            for(int i=0;i<niv[h].size();i++)
                dp[1<<i][i] = dist({0,0},niv[h][i]);
        }

        const int n = niv[h].size();
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                a[i][j] = dist(niv[h][i],niv[h][j]);

        const int mskn = 1 << n;
        for(int msk=0;msk<mskn;msk++){
            for(int i=0;i<n;i++){
                int bi = 1 << i;
                if(msk&bi)
                    for(int j=0;j<n;j++)
                        dp[msk][i] = min(dp[msk][i],dp[msk^bi][j] + a[j][i]);
            }
        }
        ll ans = inf;
        for(int i=0;i<n;i++)
            ans = min(ans,dp[mskn-1][i]);
        cout << ans << "\n";
    }
}