Submission #624215

#TimeUsernameProblemLanguageResultExecution timeMemory
624215bruceccccccAliens (IOI16_aliens)C++14
60 / 100
2084 ms40756 KiB
#include "aliens.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; #define intersectX(a, b) (b.c - a.c) / (double) (a.m - b.m) struct Photo { int x, s; }; struct Line { ll m, c; ll eval(ll x) { return m * x + c; } }; // double intersectX(Line& a, Line& b) { // return (b.c - a.c) / (double) (a.m - b.m); // } ll take_photos(int n, int m, int k, vector<int> r, vector<int> c) { vector<int> size(m, 0); for (int i = 0; i < n; i++) { if (r[i] <= c[i]) size[r[i]] = max(size[r[i]], c[i] - r[i] + 1); else size[c[i]] = max(size[c[i]], r[i] - c[i] + 1); } vector<Photo> photos; vector<ll> add(1), st(1); int prev = 0; for (int i = 0; i < m; i++) { if (size[i] > prev) { prev = size[i]; if (photos.empty() || i >= photos.back().x + photos.back().s) { st.push_back(0); add.push_back(add.back() + 1ll * size[i] * size[i]); } else { ll start = photos.back().x + photos.back().s - i; add.push_back(add.back() + 1ll * size[i] * size[i] - start * start); st.push_back(start * start); } photos.push_back({ i, size[i] }); } prev = max(0, prev - 1); } ll ans = add[photos.size()]; vector<deque<Line>> hulls(k+1); for (int i = 0; i < photos.size(); i++) { for (int j = k; j >= 1; j--) { auto& d = hulls[j-1]; ll a = 0; ll endPoint = photos[i].x + photos[i].s; if (j > 1 && d.size() > 0) { while (d.size() >= 2 && d[0].eval(endPoint) > d[1].eval(endPoint)) d.pop_front(); Line& val = d[0]; a = val.m * endPoint + val.c + 1ll * endPoint * endPoint - add[i+1]; } else if (j == 1) { ll w = endPoint - photos.front().x; a = w * w - add[i+1]; } if (i == photos.size() - 1 && j == k) { ans += a; break; } auto& q = hulls[j]; Line next = { -2 * photos[i+1].x, 1ll * photos[i+1].x * photos[i+1].x - st[i+2] + add[i+1] + a }; int s = q.size() - 1; while (s >= 1 && intersectX(next, q[s-1]) < intersectX(q[s-1], q[s])) { q.pop_back(); s--; } q.push_back(next); } } return ans; }

Compilation message (stderr)

aliens.cpp: In function 'll take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:52:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Photo>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |   for (int i = 0; i < photos.size(); i++) {
      |                   ~~^~~~~~~~~~~~~~~
aliens.cpp:68:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Photo>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |       if (i == photos.size() - 1 && j == k) {
      |           ~~^~~~~~~~~~~~~~~~~~~~
#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...