제출 #1336857

#제출 시각아이디문제언어결과실행 시간메모리
1336857FaggiAliens (IOI16_aliens)C++20
100 / 100
814 ms296260 KiB
#include <bits/stdc++.h>
#define ll long long
#define sz(x) int(x.size())
#define forn(i, n) for (i = 0; i < n; i++)
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define fr first
#define se second
using namespace std;

const int MAXN = 1e5 + 1;
const int LOG = 45;

ll L[MAXN], R[MAXN], p[MAXN][LOG];
vector<vector<ll>> dp;

vector<vector<ll>> q[LOG];

__int128 IL, IR;

ll cons(ll x, ll i, ll k)
{
    IL = 1;
    IR = 1;
    if (i > 0)
    {
        IL = IL * (q[k][i][1] - q[k][i - 1][1]);
        IR = IR * x * (q[k][i - 1][0] - q[k][i][0]);
    }
    if (i > 0 && IL > IR)
        return -1;
    IL = 1;
    IR = 1;
    if (i + 1 < sz(q[k]))
    {
        IL = IL * (q[k][i + 1][1] - q[k][i][1]);
        IR = IR * x * (q[k][i][0] - q[k][i + 1][0]);
    }
    if (i + 1 < sz(q[k]) && IL < IR)
        return 1;
    return 0;
}

ll query(ll x, ll k)
{
    ll l = 0, r = sz(q[k]) - 1, piv, ret, pos=-1;
    while (l <= r)
    {
        piv = (l + r) / 2;
        ret = cons(x, piv, k);
        if (ret == 0)
        {
            pos=piv;
            r=piv-1;
        }
        else if (ret == -1)
            r = piv - 1;
        else
            l = piv + 1;
    }
    return pos;
}

bool del(vector<ll> &a, vector<ll> &b, vector<ll> &c)
{
    IL = 1;
    IR = 1;
    IL = IL * (c[1] - a[1]) * (a[0] - b[0]);
    IR = IR * (b[1] - a[1]) * (a[0] - c[0]);
    return IL <= IR;
}

void inser(vector<ll> a, ll k)
{
    if (sz(q[k]) && q[k].back()[0] == a[0] && q[k].back()[1] == a[1])
    {
        q[k].pb(a);
        return;
    }
    while (sz(q[k]) > 1 && del(q[k][sz(q[k]) - 2], q[k].back(), a))
        q[k].pop_back();
    q[k].pb(a);
}

bool comp(vector<ll> &a, vector<ll> &b)
{
    if (a[0] != b[0])
        return a[0] < b[0];
    return a[1] > b[1];
}

long long take_photos(int n, int m, int k, std::vector<int> r, std::vector<int> c)
{
    dp.resize(n + 1, vector<ll>(LOG));
    ll i, j, res, ret, ma = -1;
    vector<ll> a;
    vector<vector<ll>> ord, v;
    for (i = 0; i < n; i++)
        ord.pb({min(r[i], c[i]), max(r[i], c[i]), i});
    sort(all(ord), comp);

    for (i = 0; i < n; i++)
    {
        if (ma < ord[i][1])
        {
            ma = ord[i][1];
            v.pb(ord[i]);
        }
    }
    swap(v, ord);
    n = sz(ord);
    for (i = 0; i < n; i++)
    {
        L[i] = ord[i][0];
        R[i] = ord[i][1];
    }
    ll l = 0, de = 1ll * m * m, C, solo, mi = LLONG_MAX, pos = 0;
    j = 0;
    while (l <= de)
    {
        C = (l + de) / 2;
        for (i = 1; i <= n; i++)
        {
            solo = (R[i - 1] - L[0] + 1) * (R[i - 1] - L[0] + 1) + C;

            ret = query(R[i - 1], j);
            if (ret == -1)
            {
                dp[i][j] = (R[i - 1] - L[i - 1]) + 1;
                dp[i][j] = dp[i][j] * dp[i][j] + C;
                p[i][j] = 1;
            }
            else
            {
                a = q[j][ret];
                p[i][j] = a[2] + 1;
                dp[i][j] = R[i - 1] * R[i - 1] + a[0] * R[i - 1] + a[1] + C;
            }
            if (solo <= dp[i][j])
            {
                p[i][j] = 1;
                dp[i][j] = solo;
            }
            if (i < n)
            {
                res = max(0ll, R[i - 1] - L[i] + 1);
                inser({-2 * (L[i] - 1), dp[i][j] + (L[i] - 1) * (L[i] - 1) - (res * res), p[i][j]}, j);
            }
        }
        if (p[n][j] <= k)
        {
            mi = dp[n][j] - C * k;
            de = C - 1;
            pos = C;
        }
        else
            l = C + 1;
        j++;
    }
    return mi;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...