#include "aliens.h"
#include <bits/stdc++.h>
using namespace std;
long long minim[4001][4001];
pair <int , int64_t> stiva[4001];
inline int64_t Query (const int limita , const int punct)
{
int stanga = 2 , dreapta = limita;
while (stanga <= dreapta)
{
const int mijloc = (stanga + dreapta) >> 1;
if (stiva[mijloc].second - stiva[mijloc - 1].second <= 1LL * punct * (stiva[mijloc - 1].first - stiva[mijloc].first))
{ stanga = mijloc + 1; }
else
{ dreapta = mijloc - 1; }
}
return 1LL * stiva[dreapta].first * punct + stiva[dreapta].second;
}
long long take_photos (int dorit , int lungime , int limita , vector <int> linie , vector<int> coloana)
{
vector < pair <int , int> > sir(dorit + 1);
for (int indice = 0 ; indice < dorit ; indice++)
{
if (coloana[indice] < linie[indice])
{ swap(linie[indice] , coloana[indice]); }
sir[indice + 1] = {linie[indice] , coloana[indice]};
}
sort(sir.begin() , sir.end());
int ramas = 1;
for (int indice = 2 ; indice <= dorit ; indice++)
{
if (sir[ramas].first == sir[indice].first)
{ sir[ramas].second = sir[indice].second; }
else
if (sir[ramas].second < sir[indice].second)
{ sir[++ramas] = sir[indice]; }
}
sir.resize(ramas + 1);
dorit = ramas;
limita = min(limita , dorit);
sir[0] = {-1 , -1};
for (int indice = 1 ; indice <= dorit ; indice++)
{ minim[indice][0] = 1000000000000000LL; }
for (int secvente = 1 ; secvente <= limita ; secvente++)
{
int cantitate = 0;
for (int dreapta = secvente ; dreapta <= dorit ; dreapta++)
{
pair <int , int64_t> candidat = {
-2 * (sir[dreapta].first - 1) ,
minim[dreapta - 1][secvente - 1] + 1LL * (sir[dreapta].first - 1) * (sir[dreapta].first - 1) - 1LL * max(0 , sir[dreapta - 1].second - sir[dreapta].first + 1) * max(0 , sir[dreapta - 1].second - sir[dreapta].first + 1)
};
while (cantitate > 1 && (candidat.second - stiva[cantitate - 1].second) * (stiva[cantitate - 1].first - stiva[cantitate].first) < (stiva[cantitate].second - stiva[cantitate - 1].second) * (stiva[cantitate - 1].first - candidat.first))
{ cantitate--; }
stiva[++cantitate] = candidat;
minim[dreapta][secvente] = Query(cantitate , sir[dreapta].second) + 1LL * sir[dreapta].second * sir[dreapta].second;
}
}
return minim[dorit][limita];
}
컴파일 시 표준 에러 (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... |