제출 #724441

#제출 시각아이디문제언어결과실행 시간메모리
724441PetyAliens (IOI16_aliens)C++14
100 / 100
281 ms13388 KiB
#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 */

컴파일 시 표준 에러 (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 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...