This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
vector<pair<long long, long long>>p, p2;
pair<long long, int>dp[100002];
struct line {
long long a, b;
int cnt;
line (long long _a, long long _b, int _cnt): a(_a), b(_b), cnt(_cnt) {};
long long eval (long long x) {
return a * x + b;
}
};
long long inter (line x, line y) {
return (y.b - x.b) / (x.a - y.a);
}
struct CHT {
vector<line>q;
vector<long long>point;
void add(line L) {
while (q.size() >= 2 && inter(L, q.back()) <= inter(q.back(), q.end()[-2])) {
q.pop_back();
point.pop_back();
}
q.push_back(L);
if (q.size() >= 2)
point.push_back(inter(q.end()[-1], q.end()[-2]));
}
pair<long long, int> get (long long x) {
int st = 0, dr = point.size() - 1, ans = point.size();
while (st <= dr) {
int mid = (st + dr) / 2;
if (x <= point[mid]) {
dr = mid - 1;
ans = mid;
}
else
st = mid + 1;
}
return {q[ans].eval(x) + x * x, q[ans].cnt + 1};
}
};
long long lol (int i) {
long long x = max(0ll, p[i].second - p[i + 1].first + 1);
return x * x;
}
void solve (int n, long long cost) {
CHT C;
dp[0] = {0, 0};
C.add(line(2 - 2 * p[1].first, p[1].first * p[1].first - 2 * p[1].first + cost + 1, 0));
for (int i = 1; i <= n; i++) {
dp[i] = C.get(p[i].second);
if (i < n)
C.add(line(2 - 2 * p[i + 1].first, dp[i].first + p[i + 1].first * p[i + 1].first - 2 * p[i + 1].first + cost + 1 - lol(i), dp[i].second));
}
}
long long take_photos(int n, int m, int k, vector<int>r, vector<int> c) {
for (int i = 0; i < n; i++) {
if (r[i] > c[i])
swap(r[i], c[i]);
p2.push_back({r[i], -c[i]});
}
sort(p2.begin(), p2.end());
p.push_back({-1, -1});
long long mx = -1;
for (int i = 0; i < n; i++) {
if (-p2[i].second > mx)
p.push_back({p2[i].first, -p2[i].second});
mx = max(mx, -p2[i].second);
}
n = p.size() - 1;
k = min(k, n);
long long st = 0, dr = INF, answer;
while (st <= dr) {
long long mid = (st + dr) / 2;
solve(n, mid);
if (dp[n].second <= k) {
answer = dp[n].first - mid * k;
dr = mid - 1;
}
else
st = mid + 1;
}
return answer;
}
// int main() {
// int n, m, k;
// assert(3 == scanf("%d %d %d", &n, &m, &k));
// std::vector<int> r(n), c(n);
// for (int i = 0; i < n; i++) {
// assert(2 == scanf("%d %d", &r[i], &c[i]));
// }
// long long ans = take_photos(n, m, k, r, c);
// printf("%lld\n", ans);
// return 0;
// }
/**
5 7 2
0 3
4 4
4 6
4 5
4 6
*/
Compilation message (stderr)
aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:95:10: warning: 'answer' may be used uninitialized in this function [-Wmaybe-uninitialized]
95 | return answer;
| ^~~~~~
# | 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... |