Submission #1275548

#TimeUsernameProblemLanguageResultExecution timeMemory
1275548afonsopereiraAliens (IOI16_aliens)C++20
4 / 100
11 ms424 KiB
#include "aliens.h" #include <bits/stdc++.h> using namespace std; using ll=long long; #define all(x) (x).begin(), (x).end() #define sz(x) int(x.size()) ll pow2(ll v){return v*v;} struct Line { ll a, b; ll eval(ll x){return a*x+b;} }; struct CHT { deque<Line> deq; void add(Line line) { if (!deq.empty() && deq.front().a==line.a) { if (deq.front().b < line.b) return; else deq.pop_front(); } while (sz(deq)>=2) { if ((__int128_t)(deq[0].a-line.a)*(__int128_t)(deq[1].b-deq[0].b)<= (__int128_t)(deq[0].b-line.b)*(__int128_t)(deq[1].a-deq[0].a)) { deq.pop_front(); } else break; } deq.push_front(line); } ll query(ll x) { while (sz(deq)>=2){ if (deq[sz(deq)-1].eval(x)>=deq[sz(deq)-2].eval(x)){ deq.pop_back(); } else break; } return deq.back().eval(x); } }; long long take_photos(int n, int m, int K, vector<int> r, vector<int> c) { vector<pair<int, int>> pts(n); for(int i=0;i<n;i++){ if (r[i]>c[i]) swap(r[i],c[i]); pts[i]=make_pair(r[i],c[i]); } sort(all(pts)); // remove dominated points { vector<pair<int,int>> pts2; for(int i=0;i<n;i++){ if (i!=n-1 && pts[i].first==pts[i+1].first) continue; pts2.push_back(pts[i]); } pts=pts2; n=sz(pts); } { vector<pair<int,int>> pts2; int mx_c = -1; for(int i=0;i<n;i++){ if (pts[i].second<=mx_c) continue; pts2.push_back(pts[i]); mx_c=max(mx_c, pts[i].second); } pts=pts2; n=sz(pts); } auto relax=[&](ll lambda) -> pair<ll,ll> { vector<ll> dp(n+1,1LL<<60); vector<int> cnt(n+1, 1<<30); dp[0]=0; cnt[0]=0; CHT cht; for(int i=0;i<=n;i++){ if(i!=0) { ll x=pts[i-1].second+1; ll mn=cht.query(x); ll res=mn+x*x; dp[i]=res; // track count for(int j=0;j<i;j++){ ll diff=0; if(j>0 && pts[j-1].second>=pts[j].first){ diff=pow2(pts[j-1].second-pts[j].first+1); } ll cost = dp[j] + pow2(pts[i-1].second-pts[j].first+1) - diff; if(cost + lambda * (cnt[j]+1) < dp[i] + lambda * cnt[i] + 1e-9){ dp[i] = cost; cnt[i] = cnt[j] + 1; } } } if(i==n) continue; ll a = -2*(pts[i].first); ll diff=0; if(i>0 && pts[i-1].second>=pts[i].first){ diff=pow2(pts[i-1].second-pts[i].first+1); } ll b=dp[i]+pow2(pts[i].first)-diff; cht.add({a, b}); } return {dp[n] - lambda * K, cnt[n]}; }; ll lo=0, hi=1LL*m*m; while(hi-lo>1) { ll mid=(lo+hi)/2; auto [val, cnt] = relax(mid); if(cnt <= K) hi = mid; else lo = mid; } ll ans = 1LL<<60; for(ll lambda=max(0LL,lo-2); lambda<=hi+2; lambda++){ auto [val, cnt] = relax(lambda); if(cnt <= K){ ans = min(ans, val + lambda * K); } } return ans; }

Compilation message (stderr)

aliens.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
aliens_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...