Cod sursa(job #2924598)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 5 octombrie 2022 22:06:21
Problema Bibel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <fstream>

using namespace std;

ifstream in ("bibel.in");
ofstream out ("bibel.out");

const int max_size = 19, max_c = (1 << 19) + 1;
const long long INF = 1e18 + 1;

struct str{
    int x, y;
};

str v[max_size], vv[max_size];
long long dp[max_c][max_size], ind[max_size], px[max_size], k, p;

long long d (str x, str y)
{
    return 1LL * (x.x - y.x) * (x.x - y.x) * (x.y - y.y) * (x.y - y.y);
}

int main ()
{
    p = 1;
    int op;
    while (in >> op)
    {
        if (op == 0)
        {
            int x, y;
            in >> x >> y;
            v[++k] = {x, y};
        }
        if (op == 1)
        {
            for (int i = 1; i <= k; i++)
            {
                ind[i] = INF;
            }
            for (int i = 1; i <= p; i++)
            {
                for (int j = 1; j <= k; j++)
                {
                    ind[j] = min(ind[j], px[i] + d(v[j], vv[i]));
                }
            }
            for (int st = 1; st < (1 << k); st++)
            {
                for (int j = 1; j <= k; j++)
                {
                    dp[st][j] = INF;
                }
            }
            for (int i = 1; i <= k; i++)
            {
                dp[(1 << (i - 1))][i] = ind[i];
            }
            for (int st = 1; st < (1 << k); st++)
            {
                for (int i = 1; i <= k; i++)
                {
                    if (st & (1 << (i - 1)))
                    {
                        for (int j = 1; j <= k; j++)
                        {
                            if (((1 << (j - 1)) & st) == 0)
                            {
                                dp[st + (1 << (j - 1))][j] = min(dp[st + (1 << (j - 1))][j], dp[st][i] + d(v[i], v[j]));
                            }
                        }
                    }
                }
            }
            long long ans = INF;
            for (int i = 1; i <= k; i++)
            {
                px[i] = dp[(1 << k) - 1][i];
                ans = min(ans, px[i]);
            }
            for (int i = 1; i <= k; i++)
            {
                vv[i] = v[i];
            }
            out << ans << '\n';
            p = k;
            k = 0;
        }
    }
    in.close();
    out.close();
    return 0;
}