#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |