제출 #384727

#제출 시각아이디문제언어결과실행 시간메모리
384727anachorAliens (IOI16_aliens)C++14
100 / 100
201 ms9744 KiB
#include<bits/stdc++.h> using namespace std; const int N = 1e5+7; typedef long long LL; typedef pair<LL, LL> PLL; long long sq(long long z) {return z*z;} PLL operator+(PLL a, PLL b) { return PLL(a.first+b.first, a.second+b.second); } struct CHT { vector<LL> M, C, P; int ptr = 0; ///Use double comp if M,C is LL range bool useless(int l1, int l2, int l3) { return (C[l3]-C[l1])*(M[l1]-M[l2]) < (C[l2]-C[l1])*(M[l1]-M[l3]); } PLL f(int id, LL x) { return {M[id]*x+C[id], P[id]+1}; } void add(LL m, LL c, LL p) { M.push_back(m); C.push_back(c); P.push_back(p); int s = M.size(); while (s >= 3 && useless(s-3, s-2, s-1)) { M.erase(M.end()-2); C.erase(C.end()-2); P.erase(P.end()-2); s--; } } PLL query(LL x) { if (ptr >= M.size()) ptr = M.size()-1; while (ptr < M.size()-1 && f(ptr, x) >= f(ptr+1, x)) ptr++; /// change > to < for maximum return f(ptr, x); } }; int x[N], y[N]; PLL dp[N]; PLL check(long long c, int n, int *x, int *y) { CHT cht; for (int i=1; i<=n; i++) { LL C = dp[i-1].first + sq(x[i]) - sq(max(0, y[i-1]-x[i])); LL M = -2*x[i]; cht.add(M, C, dp[i-1].second); dp[i] = cht.query(y[i]); dp[i].first += sq(y[i]) + c; } return dp[n]; } long long take_photos(int n, int N, int k, vector<int> xx, vector<int> yy) { vector<pair<int, int>> ranges; for (int i=0; i<n; i++) { ranges.push_back({max(xx[i], yy[i]), -min(xx[i], yy[i])}); } sort(ranges.begin(), ranges.end()); vector<pair<int, int>> r2; for (auto pr: ranges) { int r = pr.first, l = -pr.second; while (r2.size() && r2.back().first >= l) r2.pop_back(); r2.push_back({l, r}); } n = r2.size(); k = min(k, n); for (int i=1; i<=n; i++) { x[i] = r2[i-1].first, y[i] = r2[i-1].second+1; } long long lo = -1e12, hi = 1e12; while (lo < hi) { long long mid = lo + (hi-lo)/2; if (check(mid, n, x, y).second > k) lo = mid+1; else hi = mid; } return check(lo, n, x, y).first - k*lo; }

컴파일 시 표준 에러 (stderr) 메시지

aliens.cpp: In member function 'PLL CHT::query(LL)':
aliens.cpp:41:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   41 |         if (ptr >= M.size()) ptr = M.size()-1;
      |             ~~~~^~~~~~~~~~~
aliens.cpp:42:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |         while (ptr < M.size()-1 && f(ptr, x) >= f(ptr+1, x)) ptr++; /// change > to < for maximum
      |                ~~~~^~~~~~~~~~~~
#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...