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 <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <bits/stdc++.h>
#include "aliens.h"
using namespace std;
// <|°_°|>
const int MAX_POINTS = (100 * 1000);
const int LOG = (40);
struct droite {
long long pente, cst;
int prix;
};
pair <long long, long long> Points[MAX_POINTS];
pair <int, int> Aliens[MAX_POINTS];
droite Deque[MAX_POINTS];
int deb = 0, fin = 0;
int nbPoints = 0;
void Insert(droite a) {
while (fin > deb + 1 && pair<long long, int>((a.cst - Deque[fin - 1].cst) * (Deque[fin - 2].pente - Deque[fin - 1].pente), a.prix) < pair<long long, int>((Deque[fin - 1].pente - a.pente) * (Deque[fin - 1].cst - Deque[fin - 2].cst), Deque[fin - 1].prix))
fin --;
Deque[fin ++] = a;
return;
}
pair <long long, int> GetMin(long long absc) {
while (fin > deb + 1 && pair<long long, int>(absc * Deque[deb].pente + Deque[deb].cst, Deque[deb].prix) > pair<long long, int>(absc * Deque[deb + 1].pente + Deque[deb + 1].cst, Deque[deb + 1].prix))
deb ++;
return {Deque[deb].pente * absc + Deque[deb].cst, Deque[deb].prix};
}
pair <long long, int> FindDP(long long lambda) {
deb = 0, fin = 0;
pair <long long, int> DP = {0LL, 0};
// Insert({- 2 * Points[0].first, Points[0].first * Points[0].first, 0});
for (int i = 0; i < nbPoints; i ++)
{
long long d1 = 0, d2 = Points[i].first;
if (i > 0)
d1 = max(0LL, Points[i - 1].second - Points[i].first);
Insert({-2 * d2, DP.first - d1 * d1 + d2 * d2, DP.second});
DP = GetMin(Points[i].second);
DP.first += Points[i].second * Points[i].second + lambda;
DP.second ++;
}
return DP;
}
long long take_photos(int nbAliens, int tailleMax, int nbPhotos, vector<int> Lignes, vector<int> Colonnes) {
tailleMax ++;
for (int i = 0; i < nbAliens; i ++)
{
if (Lignes[i] > Colonnes[i])
swap(Lignes[i], Colonnes[i]);
Aliens[i] = {Colonnes[i] + 1, Lignes[i]};
}
sort(Aliens, Aliens + nbAliens);
for (int i = 0; i < nbAliens; i ++)
{
while (nbPoints > 0 && Aliens[i].second <= (int)Points[nbPoints - 1].second)
nbPoints --;
Points[nbPoints ++] = Aliens[i];
}
for (int i = 0; i < nbPoints; i ++)
{
swap(Points[i].first, Points[i].second);
}
long long lambda = -1;
long long ans = 0;
long long gauche = 0, droite = (long long)tailleMax * tailleMax;
while (gauche <= droite)
{
long long milieu = (gauche + droite) / 2;
pair <long long, int> dp = FindDP(milieu);
if (dp.second <= nbPhotos)
{
ans = dp.first;
droite = milieu - 1;
}
else
gauche = milieu + 1;
}
return ans - gauche * nbPhotos;
/*for (long long i = (1LL << LOG); i > 0; i /= 2)
{
pair <long long, int> DP = FindDP(lambda + i);
if (DP.second <= nbPhotos)
ans = DP.first - (lambda + i) * DP.second;
else
lambda += i;
}
return ans;*/
}
Compilation message (stderr)
aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:81:15: warning: unused variable 'lambda' [-Wunused-variable]
81 | long long lambda = -1;
| ^~~~~~
# | 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... |