제출 #586055

#제출 시각아이디문제언어결과실행 시간메모리
586055georgievskiyAliens (IOI16_aliens)C++17
4 / 100
9 ms2620 KiB
#include "aliens.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define sqr(x) ((x)*(x))
using pii = pair<int, int>;

const int N = 4001, K = 4001, M = 1e6+100;
const int inf = 2e18;
ll d[N][K];
ll t[N];
/*
struct line {
    int k, b;
    line () {
        k = 0, b = inf;
    }
    line(int k, int b) : k(k), b(b) {}
    int get(int x) {
        return k * x + b;
    }
};

struct LiChao {
    line t[4 * M];

    void add(int v, int tl, int tr, line q) {
        int m = (tl + tr) / 2;
        bool bl = q.get(tl) < t[v].get(tl), br = q.get(tr) < t[v].get(tr), bm = q.get(m) < t[v].get(m);
        if (!bl && !br)
            return;
        if (bl && br) {
            t[v] = q;
            return;
        }
        if (bl != bm) {
            line p = t[v];
            t[v] = q;
            add(2 * v + 1, tl, m, p);
        } else {
            line p = t[v];
            t[v] = q;
            add(2 * v + 2, m, tr, p);
        }
    }

    int get(int v, int tl, int tr, int x) {
        if (tl + 1 == tr)
            return t[v].get(x);
        int d, m = (tl + tr) / 2;
        if (x < m)
            d = get(2 * v + 1, tl, m, x);
        else
            d = get(2 * v + 2, m, tr, x);
        return min(d, t[v].get(x));
    }

};
*/

long long f(vector<int>&x , vector<int>& y, int lambda, int& k) {
    int n = x.size();
    vector<int> d(n, inf), s(n, 0);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j <= i; j++) {
            ll c = sqr(x[i] + 1) - 2 * (x[i] + 1) * y[j] + t[j];
            int prev = 0, seg = 0;
            if (j) prev = d[j - 1], seg = s[j - 1];
            int x = prev + c + lambda;
            if (d[i] > x)
                d[i] = x, s[i] = seg+1;
        }
    }
    k = s.back();
    return d.back();
}

long long take_photos(signed n, signed m, signed k, std::vector<signed> r, std::vector<signed> c) {
    vector<pii> a(n);
    for (int i = 0; i < n; i++) a[i] = {max(r[i], c[i]), min(r[i], c[i])};
    sort(a.begin(), a.end());
    vector<pii> st;
    for (pii p : a) {
        while (st.size() && st.back().second >= p.second)
            st.pop_back();
        st.push_back(p);
    }
    n = st.size();
    vector<int> x(n), y(n);
    for (int i = 0; i < n; i++)
        x[i] = st[i].first, y[i] = st[i].second;

    for (int i = 0; i < n; i++) {
        if (i)
            t[i] = max(0ll, x[i - 1] - y[i] + 1);
        t[i] = sqr(t[i]);
        t[i] = sqr(y[i]) - t[i];
    }

    for (int i = 0; i < n; i++)
        for (int w = 0; w <= k; w++)
            d[i][w] = inf;

    k = min(k, n);

    int lo = -1, hi = 1e11;
    while (hi - lo > 1) {
        int c = (hi + lo) / 2;
        int seg = 0;
        f(x, y, c, seg);
        if (seg > k)
            lo = c;
        else
            hi = c;
    }
    int t;
    int ans = f(x, y, hi, t);
    ans -= hi * t;
    return ans;
}
#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...