#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |