Cod sursa(job #2976811)

Utilizator VmanDuta Vlad Vman Data 10 februarie 2023 04:35:19
Problema Bibel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

long long best[18][1 << 18];

inline int sqr(int a) { return a * a; }

void solve(vector<pair<int,int> > &v, pair<int, int> start, int startDist, vector<int> &res) {
    int n = v.size();
    for (int k = 0; k < n; ++k) {
        for (int i = 0; i < (1<<n); ++i) {
            best[k][i] = 1000000000000000;
        }
    }
    for (int k = 0; k < n; ++k) {
        best[k][1 << k] = startDist + sqr(v[k].first - start.first) + sqr(v[k].second - start.second);
    }
    for (int i = 1; i < 1 << n; ++i) {
        for (int k = 0; k < n; ++k) {
            for (int j = 0; j < n; ++j) {
                if ((1 << j) & i) {
                    best[j][i] = min(best[j][i], best[k][i - (1<<j)] + sqr(v[k].first - v[j].first) + sqr(v[k].second - v[j].second));
                }
            }
        }
    }
    for (int k = 0; k < n; ++k) {
        res[k] = best[k][(1 << n) - 1];
    }
}

int main() {
    freopen("bibel.in", "r", stdin);
    freopen("bibel.out", "w", stdout);
    
    int op;
    vector<pair<int,int> > level;
    vector<pair<int,int> > prevLevel;
    vector<int> prevRes(1);
    prevLevel.push_back(make_pair(0, 0));
    while (true) {
        cin >> op;
        if (op == 2) {
            return 0;
        }
        
        if (op == 1) {
            vector<int> res(level.size(), 2000000000);
            
            for (int i = 0; i < prevLevel.size(); ++i) {
                solve(level, prevLevel[i], prevRes[i], res);
            }
            prevRes = res;
            prevLevel = level;
            level.clear();
            
            int best = res[0];
            for (auto it : res) {
                best = min(best, it);
            }
            cout << best << "\n";
            
            continue;
        }
        
        int x, y;
        cin >> x >> y;
        level.push_back(make_pair(x, y));
    }
    
    return 0;
}