Submission #748559

#TimeUsernameProblemLanguageResultExecution timeMemory
748559AnhPhamAliens (IOI16_aliens)C++17
100 / 100
147 ms12988 KiB
#include "aliens.h"
#include <bits/stdc++.h>

#define long long long
#define pii pair<long, long>
#define x first
#define y second

using namespace std;

struct cht {
    struct line {
        long m, b;
        int cnt;
        line(long m, long b, int cnt) : m(m), b(b), cnt(cnt) {}
        long get(long x) { return m * x + b; }
    };
    vector<line> f;
    int ptr = 0;
    bool bad(line a, line b, line c) {
        return (c.b - a.b) * (a.m - b.m) <= (b.b - a.b) * (a.m - c.m);
    }
    void add(long m, long b, int cnt) {
        line l(m, b, cnt);
        while (f.size() >= 2 && bad(f[f.size() - 2], f.back(), l))
            f.pop_back();
        f.emplace_back(l);
    }
    pii query(long x) {
        while (ptr + 1 < f.size() && f[ptr + 1].get(x) < f[ptr].get(x))
            ++ptr;
        return pii(f[ptr].get(x), f[ptr].cnt);
    }
    void clear() { f.clear(), ptr = 0; }
} hull;

int n;
long mx = 0;
vector<long> l = {-1}, r = {-1};

long sq(long a) { return a * a; }

pii solve(long C) {
    vector<pii> dp = vector<pii>(n + 1);
    hull.clear();
    dp[0] = {0, 0};
    hull.add(-2ll * (l[1] - 1), sq(l[1] - 1), 0);
    for (int i = 1; i <= n; i++) {
        pii now = hull.query(r[i]);
        dp[i] = pii(now.x + sq(r[i]) + C, now.y + 1);
        if (i == n)
            continue;
        hull.add(-2ll * (l[i + 1] - 1),
                 sq(l[i + 1] - 1) + dp[i].x - sq(max(0ll, r[i] - l[i + 1] + 1)),
                 dp[i].y);
    }
    return dp[n];
}

long take_photos(int _n, int _m, int k, vector<int> _r, vector<int> _c) {
    vector<pii> coord;
    for (int i = 0; i < _n; i++) {
        if (_r[i] > _c[i])
            swap(_r[i], _c[i]);
        coord.emplace_back(_c[i], _r[i]);
    }
    sort(coord.begin(), coord.end());
    coord.erase(unique(coord.begin(), coord.end()), coord.end());
    for (pii p : coord) {
        if (p.x == r.back())
            continue;
        while (!l.empty() && p.x >= r.back() && p.y <= l.back())
            l.pop_back(), r.pop_back();
        l.emplace_back(p.y), r.emplace_back(p.x);
    }
    n = l.size() - 1;
    k = min(k, n);
    long a = 0, b = 1e17;
    while (a < b) {
        long mid = (a + b) >> 1;
        if (solve(mid).y <= k)
            b = mid;
        else
            a = mid + 1;
    }
    return solve(b).x - b * k;
}

Compilation message (stderr)

aliens.cpp: In member function 'std::pair<long long int, long long int> cht::query(long long int)':
aliens.cpp:30:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<cht::line>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 |         while (ptr + 1 < f.size() && f[ptr + 1].get(x) < f[ptr].get(x))
      |                ~~~~~~~~^~~~~~~~~~
#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...