제출 #389117

#제출 시각아이디문제언어결과실행 시간메모리
389117alishahali1382Aliens (IOI16_aliens)C++14
100 / 100
164 ms9140 KiB
#include "aliens.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; #define debug(x) {cerr<<#x<<"="<<x<<"\n";} #define debug2(x, y) {cerr<<#x<<", "<<#y<<" = "<<x<<", "<<y<<"\n";} #define debugp(p) {cerr<<#p<<"={"<<p.first<<", "<<p.second<<"}\n";} #define pb push_back #define all(x) x.begin(), x.end() const int inf=1000001000; const ll INF=10000000010000000; const int MAXN=100010, K=MAXN; int n, m, k; pii A[MAXN]; pll dp[MAXN]; ll Inter(pll a, pll b){ if (a.first==b.first) return (a.second<=b.second?-INF:INF); return (a.second-b.second)/(b.first-a.first) + ((a.second-b.second)%(b.first-a.first)>0); } struct CHT{ pair<ll, pll> A[MAXN]; int B[MAXN]; int L, R; inline void Add(pll x, int y){ while (L<R && Inter(A[R-1].second, x)<A[R-1].first) R--; B[R]=y; if (L==R) A[R++]={-INF, x}; else A[R]={Inter(A[R-1].second, x), x}, R++; } inline pll Get(ll x){ while (L+1<R && A[L+1].first<=x) L++; pll p=A[L].second; return {p.first*x+p.second, B[L]}; } } cht; inline ll _sq(ll x){ return x*x;} pll Solve(ll cost){ dp[0]={0, 0}; cht.L=cht.R=0; for (int i=1; i<=n; i++){ ll val=_sq(A[i].first)+dp[i-1].first; if (i!=1 && A[i].first<=A[i-1].second) val-=_sq(A[i-1].second-A[i].first+1); cht.Add({2*A[i].first, -val}, dp[i-1].second); pll p=cht.Get(A[i].second+1); dp[i]={_sq(A[i].second+1)-p.first + cost, p.second+1}; } return dp[n]; } ll take_photos(int _n, int _m, int _k, vector<int> r, vector<int> c) { k=_k; m=_m; vector<pii> vec; for (int i=0; i<_n; i++) vec.pb({min(r[i], c[i]), max(r[i], c[i])}); sort(all(vec), [](pii i, pii j){ if (i.second!=j.second) return i.second<j.second; return i.first>j.first; }); for (pii p:vec){ while (n && p.first<=A[n].first) n--; A[++n]=p; } // for (int i=1; i<=n; i++) debugp(A[i]) k=min(k, n); ll dwn=-1, up=1e12; while (up-dwn>1){ ll mid=(dwn+up)>>1; pll p=Solve(mid); if (p.second>=k) dwn=mid; else up=mid; } pll p=Solve(dwn); // debug(dwn) // debugp(p) return p.first - k*dwn; }
#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...