제출 #429318

#제출 시각아이디문제언어결과실행 시간메모리
429318JeanBombeurAliens (IOI16_aliens)C++17
100 / 100
138 ms7900 KiB
#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;*/ }

컴파일 시 표준 에러 (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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...