# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1274349 | coderg300711 | Aliens (IOI16_aliens) | C++20 | 0 ms | 0 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;
}
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));
{
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);
}
vector<vector<ll>> dp(n+1,vector<ll>(K+1,1LL<<60));
dp[0][0]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
ll diff=pow2(pts[i-1].second-pts[j].first+1;)
ll cost=diff-pow2(max(0LL,(j==0?0LL:(ll(pts[j-1].second-pts[j].first+1)))));
for(int k=0;k<K;k++)dp[i][k+1]=min(dp[i][k+1],dp[j][k]+cost);
}
}
ll ans=1LL<<60;
for(int i=0;i<=K;i++)ans=min(ans,dp[n][i]);
return ans;
}