This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "aliens.h"
#include<algorithm>
#include<iostream>
#include<vector>
#include<stdio.h>
using namespace std;
#define INF 1000000000000000000
typedef pair<long long int,long long int> pii;
vector<pair<long long int,long long int> >arr;
long long int DP[50001][4001];
int p;
long long sq2(long long x){
if(x>0)return x*x;
return 0;
}
bool cmp(pii a, pii b){
if(a.first==b.first){
if(a.second>b.second)return true;
return false;
}
if(a.first<b.first)return true;
return false;
}
long long int min(long long int a, long long int b){
if(a<b)return a;
return b;
}
long long int computecost(int i, int j){
if(j<i)return 0;
long long int R=arr[j].second-arr[i].first+1;
R*=R;
if(i>0){
R-=sq2(arr[i-1].second-arr[i].first+1);
}
return R;
}
void compute(int x, int y, int photos, int a, int b){
if(x>y)return;
int mid=(x+y)/2;
int best=-1;
for(int i=a;i<=b;i++){
if(DP[mid][photos]>DP[i][photos-1]+computecost(i,mid-1)){
best=i;
DP[mid][photos]=DP[i][photos-1]+computecost(i,mid-1);
}
}
compute(x,mid-1,photos,a,best);
compute(mid+1,y,photos,best,b);
}
long long take_photos(int n, int m, int k, vector<int> r,vector<int> c) {
pair<long long int,long long int>points[n];
for(int i=0;i<n;i++){
points[i]=pair<long long int,long long int>(r[i],c[i]);
if(r[i]>c[i])swap(points[i].first,points[i].second);
}
sort(points,points+n,cmp);
long long int cnt=-1;
for(int i=0;i<n;i++){
if(points[i].second>cnt){
cnt=points[i].second;
arr.push_back(points[i]);
//printf("%lld %lld \n",points[i].first,points[i].second);
}
}
p=arr.size();
//cout<<p<<endl;
/*for(int i=0;i<p;i++){//OK
for(int j=i;j<p;j++){
cout<<computecost(i,j)<<" ";
}cout<<endl;
}*/
for(int i=0;i<=k;i++){
for(int j=0;j<=p;j++){
DP[j][i]=INF;
}
}
DP[0][0]=0;
for(int photo=1;photo<=k && photo<=p;photo++){
compute(0,p,photo,0,p);
//for(int j=0;j<=p;j++)cout<<DP[j][photo]<<" ";
//cout<<endl;
}
long long int ans=INF;
for(int i=0;i<=k;i++)ans=min(ans,DP[p][i]);
return ans;
}
# | 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... |