제출 #382570

#제출 시각아이디문제언어결과실행 시간메모리
382570MetalPowerAliens (IOI16_aliens)C++14
100 / 100
142 ms10452 KiB
#include <bits/stdc++.h> #include "aliens.h" using namespace std; #define ll long long const ll MAXN = 1e5 + 100; #define pii pair<ll, ll> #define fi first #define se second struct inv{ ll l; ll r; }; struct line{ ll m; ll c; ll cnt; ll getY(ll x){ return m * x + c; } } cht[MAXN]; ll l = 0, r = 1; bool betterLine(line& a, line& b, line& c){ ll lhs = (c.c - a.c) * (a.m - b.m), rhs = (b.c - a.c) * (a.m - c.m); return lhs < rhs || (lhs == rhs && c.cnt < b.cnt); } bool betterQue(line& a, line& b, ll x){ ll lhs = a.getY(x), rhs = b.getY(x); return lhs > rhs || (lhs == rhs && b.cnt < a.cnt); } void insertLine(line L){ while(r - l >= 2 && betterLine(cht[r - 2], cht[r - 1], L))r--; cht[r++] = L; } pii query(ll x){ while(r - l >= 2 && betterQue(cht[l], cht[l + 1], x))l++; return {cht[l].getY(x), cht[l].cnt}; } vector<inv> v, grid; bool cmpGrid(inv& a, inv& b){ return a.l < b.l || (a.l == b.l && a.r > b.r); } void buildVector(){ sort(grid.begin(), grid.end(), cmpGrid); ll sz = grid.size(); inv prev = {-1, -1}; for(ll i = 0; i < sz; i++){ if(grid[i].r > prev.r){ v.push_back(grid[i]); prev = grid[i]; } } } void initcht(){ cht[0] = {-2 * v[0].l + 2, (v[0].l - 1) * (v[0].l - 1), 0}; l = 0, r = 1; } ll memo[MAXN], cnt[MAXN]; pii dp(ll val, ll n){ memo[0] = cnt[0] = 0; initcht(); for(ll i = 1; i <= n; i++){ pii queAns = query(v[i-1].r); memo[i] = queAns.fi + v[i-1].r * v[i-1].r + val; cnt[i] = queAns.se + 1; if(i < n){ ll m = -2 * v[i].l + 2, maxim = max((ll)0, (ll)(v[i-1].r - v[i].l + 1)); ll c = memo[i] - maxim * maxim + (v[i].l - 1) * (v[i].l - 1); insertLine({m, c, cnt[i]}); } } return {memo[n], cnt[n]}; } ll take_photos(int a, int b, int c, vector<int> R, vector<int> C) { ll n = (ll)a, m = (ll)b, k = (ll)c; for(ll i = 0; i < n; i++){ grid.push_back({(ll)min(R[i], C[i]), (ll)max(R[i], C[i])}); } buildVector(); ll l = 0, r = 1e12, ans = 0; while(l <= r){ ll mid = (l + r) >> 1; pii val = dp(mid, v.size()); if(val.se <= k){ ans = val.fi - k * mid, r = mid - 1; } else l = mid + 1; } return ans; }

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

aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:86:16: warning: unused variable 'm' [-Wunused-variable]
   86 |  ll n = (ll)a, m = (ll)b, k = (ll)c;
      |                ^
#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...