Submission #731818

#TimeUsernameProblemLanguageResultExecution timeMemory
731818vjudge1Aliens (IOI16_aliens)C++11
60 / 100
2065 ms19388 KiB
#include "aliens.h"

#include <bits/stdc++.h>
using namespace std;

class cht_t {
       public:
        class line_t {
               public:
                int64_t a, b;
                line_t(int64_t a = 0, int64_t b = 0) : a(a), b(b) {}
                int64_t operator()(const int64_t& x) const {
                        return a * x + b;
                }
                friend bool check(const line_t& lhs, const line_t& rhs, const line_t& cur) {
                        return 1.0 * (rhs.b - cur.b) / (cur.a - rhs.a) < 1.0 * (lhs.b - cur.b) / (cur.a - lhs.a);
                        return (rhs.b - cur.b) * (cur.a - lhs.a) < (lhs.b - cur.b) * (cur.a - lhs.a);
                }
        };
        deque<line_t> dq;
        void insert(const int64_t& a, const int64_t& b) {
                line_t new_line(a, b);
                while (dq.size() > 1 && check(dq[dq.size() - 2], dq.back(), new_line)) {
                        dq.pop_back();
                }
                dq.emplace_back(new_line);
        }

        int64_t get_min(const int64_t& x) {
                while (dq.size() > 1 && dq[0](x) > dq[1](x)) dq.pop_front();
                return dq[0](x);
        }
};

long long take_photos(int n, int m, int k, std::vector<int> a, std::vector<int> b) {
        for (int i = 0; i < n; i++) {
                if (a[i] > b[i]) swap(a[i], b[i]);
        }
        vector<int> ord(n);
        iota(ord.begin(), ord.end(), 0);
        sort(ord.begin(), ord.end(), [&](int i, int j) {
                return a[i] == a[j] ? b[i] > b[j] : a[i] < a[j];
        });
        vector<int> l, r;
        int last = -1;
        for (int i = 0; i < n; i++) {
                if (b[ord[i]] <= last) continue;
                l.emplace_back(a[ord[i]] - 1);
                r.emplace_back(b[ord[i]]);
                last = b[ord[i]];
        }

        n = l.size();
        k = min(k, n);

        auto cost = [](int l, int r) {
                if (l > r) return 0ll;
                return 1ll * (r - l) * (r - l);
        };

        vector<cht_t> cht(k - 1);

        int64_t f;

        for (int i = 0; i < n; i++) {
                for (int j = min(i, k - 1); j >= 0; j--) {
                        if (i + k - j > n) continue;
                        f = j ? cht[j - 1].get_min(r[i]) + 1ll * r[i] * r[i] : cost(l[0], r[i]);
                        if (i + 1 < n && j != k - 1) cht[j].insert(-2 * l[i + 1], f + 1ll * l[i + 1] * l[i + 1] - cost(l[i + 1], r[i]));
                }
        }

        return f;
}

Compilation message (stderr)

aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:73:16: warning: 'f' may be used uninitialized in this function [-Wmaybe-uninitialized]
   73 |         return f;
      |                ^
#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...