Submission #412522

#TimeUsernameProblemLanguageResultExecution timeMemory
412522vlamarcaAliens (IOI16_aliens)C++17
100 / 100
220 ms7832 KiB
#include <bits/stdc++.h> using namespace std; #define fr(i,n) for(int i = 0; i<n; i++) #define sz(v) (int)(v.size()) #define prin(a) cout << #a << " = " << a << endl #define all(v) (v).begin(),(v).end() typedef long long ll; #define fi first #define se second struct Line{ // y = m*x + k ll m,k,qnt; ll eval(ll x){ return m*x+k; } Line(){} Line(ll _m, ll _k, ll _qnt){ m = _m, k = _k, qnt = _qnt; } }; struct ChtDeque{ vector<Line> dq; int l, r; // [l,r) ChtDeque(){} ChtDeque(int n){ dq.resize(n); l = r = 0; } ll div(ll a, ll b){ return a/b - ( (a^b)<0 and a%b); } bool tirar(Line &l1, Line &l2, Line &l3){ if(l1.m==l2.m){ return l1.k>=l2.k; } return div(l2.k-l3.k,l3.m-l2.m)<=div(l1.k-l2.k,l2.m-l1.m); } void add(ll m, ll k, ll qnt){ m*=-1,k*=-1; Line line(m,k,qnt); while(r-l>=2){ if(tirar(dq[r-2],dq[r-1],line)) r--; else break; } dq[r++] = line; } pair<ll,ll> query(ll x){ assert(r>l); while(r-l>=2){ ll val_l = dq[l].eval(x); ll val_l1 = dq[l+1].eval(x); if(val_l1>val_l) l++; else break; } return {-dq[l].eval(x),dq[l].qnt}; } }; vector<pair<ll,ll>> vp; pair<ll,ll> f(ll c){ ChtDeque cht(sz(vp)+1); ll udp = 0, uqnt = 0; fr(i,sz(vp)){ ll ri,ci; tie(ri,ci) = vp[i]; ci++; ll sub = 0; if(i){ ll rj,cj; tie(rj,cj) = vp[i-1]; cj++; if(cj>ri) sub = (cj-ri)*(cj-ri); } cht.add(-2*ri,ri*ri+udp+c-sub,uqnt); ll dp, qnt; tie(dp,qnt) = cht.query(ci); dp+=ci*ci; qnt++; udp = dp, uqnt = qnt; } return {udp,uqnt}; } ll take_photos(int n, int m, int k, vector<int> vr, vector<int> vc){ vp.clear(); fr(i,n){ if(vc[i]<vr[i]) swap(vc[i],vr[i]); vp.emplace_back(vr[i],vc[i]); } { sort(all(vp)); reverse(all(vp)); vector<pair<ll,ll>> aux; for(auto &[i,j] : vp){ if(!aux.empty() and aux.back().fi==i) continue; while(!aux.empty() and j>=aux.back().se) aux.pop_back(); aux.emplace_back(i,j); } reverse(all(aux)); vp = aux; } ll lo = 0, hi = (ll)m*m; while(lo<hi){ ll mid = (lo+hi)/2; if(f(mid).se<=k) hi = mid; else lo = mid+1; }; auto par = f(lo); return par.fi-(ll)k*lo; }
#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...