Submission #413281

#TimeUsernameProblemLanguageResultExecution timeMemory
413281ja_kingyAliens (IOI16_aliens)C++14
100 / 100
311 ms10512 KiB
#include "aliens.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pii; const int mxN = 1e5; vector<int> stk; ll n, m, k, dp[mxN], pho[mxN], bst, l[mxN], r[mxN]; ll sqr(ll x) {return x*x;} struct line {ll m, c, pcnt;}; vector<line> lines; long double sect(line a, line b) {return (long double)(a.m - b.m) / (b.c - a.c);} const long double EPS = 1e-15; ll eval(line l, ll x) {return l.m*x + l.c;} void upd(line l) { while (lines.size() > 1 && sect(l, lines[lines.size()-2]) < sect(l, lines.back())) { lines.pop_back(); } while (lines.size() > 1 && fabs(sect(l, lines[lines.size()-2]) - sect(l, lines.back())) < EPS && l.pcnt <= lines.back().pcnt) { lines.pop_back(); } lines.push_back(l); bst = min(bst, (ll)lines.size()-1); } line qry(ll x) { while (bst < lines.size()-1 && ((eval(lines[bst+1], x) < eval(lines[bst], x)) || (eval(lines[bst+1], x) == eval(lines[bst], x) && lines[bst+1].pcnt <= lines[bst].pcnt))) bst++; return lines[bst]; } int slv(ll cst) { lines.clear(); upd({-2*l[stk[0]], sqr(l[stk[0]]), 0}); for (int i = 0; i < stk.size(); ++i) { ll ri = r[stk[i]]+1; line res = qry(ri); dp[i] = cst + sqr(ri) + eval(res, ri); pho[i] = res.pcnt + 1; if (i+1 < stk.size()) upd({-2*l[stk[i+1]], dp[i] - sqr(max(0ll,ri-l[stk[i+1]])) + sqr(l[stk[i+1]]), pho[i]}); } return pho[stk.size() - 1]; } ll take_photos(int N, int m, int k, vector<int> R, vector<int> C) { n = N; for (int i = 0; i < n; ++i) { l[i] = min(R[i], C[i]); r[i] = max(R[i], C[i]); } vector<int> order(n); iota(order.begin(), order.end(), 0); sort(order.begin(), order.end(), [&](int a, int b){return r[a] < r[b];}); for (int i: order) { while (stk.size() && l[stk.back()] >= l[i]) stk.pop_back(); stk.push_back(i); } ll lo = 0, hi = (ll)m*m, mid; while (lo != hi) { mid = lo+hi>>1; if (slv(mid) <= k) hi = mid; else lo = mid + 1; } slv(lo); return dp[stk.size()-1] - k*lo; }

Compilation message (stderr)

aliens.cpp: In function 'line qry(ll)':
aliens.cpp:33:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<line>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   33 |     while (bst < lines.size()-1 && ((eval(lines[bst+1], x) < eval(lines[bst], x)) || (eval(lines[bst+1], x) == eval(lines[bst], x) && lines[bst+1].pcnt <= lines[bst].pcnt))) bst++;
      |            ~~~~^~~~~~~~~~~~~~~~
aliens.cpp: In function 'int slv(ll)':
aliens.cpp:40:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |     for (int i = 0; i < stk.size(); ++i) {
      |                     ~~^~~~~~~~~~~~
aliens.cpp:45:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |         if (i+1 < stk.size()) upd({-2*l[stk[i+1]], dp[i] - sqr(max(0ll,ri-l[stk[i+1]])) + sqr(l[stk[i+1]]), pho[i]});
      |             ~~~~^~~~~~~~~~~~
aliens.cpp: In function 'll take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:65:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   65 |         mid = lo+hi>>1;
      |               ~~^~~
#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...