Submission #1275545

#TimeUsernameProblemLanguageResultExecution timeMemory
1275545afonsopereiraAliens (IOI16_aliens)C++20
0 / 100
1 ms344 KiB
#include "aliens.h" #include <bits/stdc++.h> using namespace std; using ll = long long; struct Line { ll a, b; int cnt; // count of photos used ll eval(ll x) { return a * x + b; } }; struct CHT { deque<Line> dq; bool bad(Line l1, Line l2, Line l3) { return (__int128)(l3.b - l1.b) * (l1.a - l2.a) <= (__int128)(l2.b - l1.b) * (l1.a - l3.a); } void add(Line line) { while (!dq.empty() && dq.back().a == line.a) { if (dq.back().b >= line.b) dq.pop_back(); else return; } while (dq.size() >= 2 && bad(dq[dq.size()-2], dq[dq.size()-1], line)) { dq.pop_back(); } dq.push_back(line); } pair<ll, int> query(ll x) { while (dq.size() >= 2 && dq[0].eval(x) >= dq[1].eval(x)) { dq.pop_front(); } return {dq[0].eval(x), dq[0].cnt}; } }; ll take_photos(int n, int m, int k, vector<int> r, vector<int> c) { vector<pair<int, int>> segs; for (int i = 0; i < n; i++) { int l = min(r[i], c[i]); int rt = max(r[i], c[i]); segs.push_back({l, rt}); } sort(segs.begin(), segs.end(), [](auto &a, auto &b) { if (a.first != b.first) return a.first < b.first; return a.second > b.second; }); vector<pair<int, int>> intervals; int max_right = -1; for (auto [l, r] : segs) { if (r > max_right) { intervals.push_back({l, r}); max_right = r; } } n = intervals.size(); k = min(k, n); if (n == 0) return 0; auto solve = [&](ll lambda) -> pair<ll, int> { CHT cht; vector<ll> dp(n + 1, 1e18); vector<int> cnt(n + 1, 0); dp[0] = 0; cht.add({-2LL * intervals[0].first, 1LL * intervals[0].first * intervals[0].first + lambda, 1}); for (int i = 0; i < n; i++) { ll right = intervals[i].second + 1; auto [val, c] = cht.query(right); dp[i + 1] = val + 1LL * right * right; cnt[i + 1] = c; if (i + 1 < n) { ll overlap = 0; if (intervals[i].second >= intervals[i + 1].first) { ll len = intervals[i].second - intervals[i + 1].first + 1; overlap = len * len; } ll a = -2LL * intervals[i + 1].first; ll b = dp[i + 1] + 1LL * intervals[i + 1].first * intervals[i + 1].first - overlap + lambda; cht.add({a, b, cnt[i + 1] + 1}); } } return {dp[n], cnt[n]}; }; ll lo = 0, hi = 2LL * m * m; ll ans = 1e18; while (lo <= hi) { ll lambda = lo + (hi - lo) / 2; auto [cost, photos] = solve(lambda); ll actual_cost = cost - lambda * k; ans = min(ans, actual_cost); if (photos <= k) { hi = lambda - 1; } else { lo = lambda + 1; } } 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...