Submission #1248967

#TimeUsernameProblemLanguageResultExecution timeMemory
1248967CyanmondAliens (IOI16_aliens)C++20
0 / 100
0 ms328 KiB
#include "aliens.h"

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

#define ALL(x) (x).begin(), (x).end()
#define REP(i, l, r) for (int i = (l); i < (r); ++i)
#define len(x) int(x.size())

ll pow2(ll v) { return v * v; }

struct Line {
    ll a, b;
    ll eval(ll x) { return a * x + b; }
};

struct CHT {
    // add: decrease
    // query: increase
    // query: min

    deque<Line> deq;

    void add(Line line) {
        if (not deq.empty() and deq.front().a == line.a) {
            if (deq.front().b < line.b) {
                return;
            } else {
                deq.pop_front();
            }
        }
        while (len(deq) >= 2) {
            if (__int128_t(deq[0].a - line.a) *
                    __int128_t(deq[1].b - deq[0].b) <=
                __int128_t(deq[0].b - line.b) *
                    __int128_t(deq[1].a - deq[0].a)) {
                deq.pop_front();
            } else {
                break;
            }
        }
        deq.push_front(line);
    }

    ll query(ll x) {
        while (len(deq) >= 2) {
            if (deq[len(deq) - 1].eval(x) >= deq[len(deq) - 2].eval(x)) {
                deq.pop_back();
            } else {
                break;
            }
        }
        return deq.back().eval(x);
        ll mn = 1ll << 60;
        for (auto &line : deq)
            mn = min(mn, line.eval(x));
        return mn;
    }
};

long long take_photos(int n, int m, int K, std::vector<int> r,
                      std::vector<int> c) {
    vector<pair<int, int>> pts(n);
    REP(i, 0, n) {
        if (r[i] > c[i]) {
            swap(r[i], c[i]);
        }
        pts[i] = make_pair(r[i], c[i]);
    }
    sort(ALL(pts));
    {
        vector<pair<int, int>> pts2;
        REP(i, 0, n) {
            if (i != n - 1 and pts[i].first == pts[i + 1].first) {
                continue;
            }
            pts2.push_back(pts[i]);
        }
        pts = pts2;
        n = len(pts);
    }
    {
        vector<pair<int, int>> pts2;
        int mx_c = -1;
        REP(i, 0, n) {
            if (pts[i].second <= mx_c) {
                continue;
            }
            pts2.push_back(pts[i]);
            mx_c = max(mx_c, pts[i].second);
        }
        pts = pts2;
        n = len(pts);
    }

    auto relax = [&](ll lambda) {
        vector<ll> dp(n + 1, 1ll << 60);
        dp[0] = 0;
        CHT cht;
        REP(i, 0, n + 1) {
            if (i != 0) {
                ll x = pts[i - 1].second;
                ll mn = cht.query(x);
                ll res = mn + x * x + lambda;
                dp[i] = res;
            }

            if (i == n) {
                continue;
            }
            ll a = 2 * (-pts[i].first + 1);
            ll diff = pow2(max(0ll, i == 0 ? 0ll : (pts[i - 1].second - pts[i].first + 1)));
            ll b = dp[i] + pow2(-pts[i].first + 1) - diff;
            cht.add({a, b});
        }

        return dp[n] - lambda * K;
    };

    ll lo = -(1ll << 40), hi = 1ll << 40;
    while (hi - lo > 3) {
        ll m1 = (2 * lo + hi) / 3;
        ll m2 = (lo + 2 * hi) / 3;

        if (relax(m1) > relax(m2)) {
            hi = m2 - 1;
        } else {
            lo = m1 + 1;
        }
    }
    ll ans = -1;
    for (ll lambda = lo; lambda <= hi; ++lambda) {
        ans = max(ans, relax(lambda));
    }
    return ans;
}

Compilation message (stderr)

aliens.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
aliens_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...