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 <bits/stdc++.h>
#define pii pair<int,int>
#define ll long long
using namespace std;
bool cmp(pii x , pii y)
{
if(x.first == y.first)return x.second > y.second;
return x.first < y.first;
}
struct CHT{
vector<ll>m;
vector<ll>p;
int it=0;
bool check()
{
if(m.size() < 3)return false;
int l1 = m.size() - 3;
int l2 = m.size() - 2;
int l3 = m.size() - 1;
return double(p[l3] - p[l1]) * (m[l1] - m[l2]) < double(p[l2] - p[l1]) * (m[l1] - m[l3]);
}
void add(ll M,ll P)
{
m.push_back(M);
p.push_back(P);
while(check())
{
m.erase(m.end() - 2);
p.erase(p.end() - 2);
}
}
ll calc(ll x,int i)
{
return x * m[i] + p[i];
}
ll query(ll x)
{
if(it >= m.size() )it = m.size() - 1;
while(it < m.size() - 1 && calc(x , it) >= calc(x , it + 1 ) ){
++it;
}
return calc(x , it);
}
}ds[105];
long long take_photos(int n, int m, int k, std::vector<int> r, std::vector<int> c) {
vector<pii>tmp;
vector<pii>v;
for(int i = 0 ; i < n ; ++i)
tmp.push_back( { min( r[i], c[i] ) , max( r[i] , c[i] ) } );
sort( tmp.begin() , tmp.end() , cmp );
int last = -1;
for(int i = 0 ; i < n ; ++i)
{
if(tmp[i].second <= last)continue;
v.push_back( tmp[i] );
last = max(last , tmp[i].second);
}
ll ans = (1LL <<61);
for(int i= 0 ; i <= k; ++i)
ds[i].add(-2 * (v[0].first - 1) , (v[0].first - 1) * (v[0].first - 1) );
n = v.size();
for(int i = 0 ; i < n ; ++i)
{
ll l = v[i].first;
ll r = v[i].second;
for(int j = k ; j >= 1 ; --j)
{
ll dp = ds[j - 1].query(r) + r * r;
if(i == n - 1)ans = min(ans , dp);
if(i < n - 1)
{
ll L = v[i + 1].first;
ll mx = max(0LL , r - L + 1);
ds[j].add( -2 * (L - 1) , (L - 1) * (L - 1) + dp + mx * mx );
}
}
}
return ans;
}
Compilation message (stderr)
aliens.cpp: In member function 'long long int CHT::query(long long int)':
aliens.cpp:39:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(it >= m.size() )it = m.size() - 1;
^
aliens.cpp:40:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(it < m.size() - 1 && calc(x , it) >= calc(x , it + 1 ) ){
^
aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:69:9: warning: unused variable 'l' [-Wunused-variable]
ll l = v[i].first;
^
# | 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... |