제출 #1193470

#제출 시각아이디문제언어결과실행 시간메모리
1193470SSKMFAliens (IOI16_aliens)C++20
4 / 100
0 ms580 KiB
#include "aliens.h" #include <bits/stdc++.h> using namespace std; long long minim[4001][4001]; pair <int , int64_t> stiva[4001]; inline long double Intersectie (pair <int , int64_t> &dreapta_1 , pair <int , int64_t> &dreapta_2) { return (long double)(dreapta_2.second - dreapta_1.second) / (dreapta_1.first - dreapta_2.first); } inline int64_t Query (const int limita , const int punct) { int64_t rezultat = INT64_MAX; for (int i = 1 ; i <= limita ; i++) { rezultat = min(rezultat , (int64_t)stiva[i].first * punct + stiva[i].second); } return rezultat; int stanga = 2 , dreapta = limita; while (stanga <= dreapta) { const int mijloc = (stanga + dreapta) >> 1; if (Intersectie(stiva[mijloc] , stiva[mijloc - 1]) <= punct) { 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; minim[secvente - 1][secvente] = 1000000000000000LL; 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 && Intersectie(candidat , stiva[cantitate - 1]) <= Intersectie(candidat , stiva[cantitate])) { cantitate--; } stiva[++cantitate] = candidat; minim[dreapta][secvente] = Query(cantitate , sir[dreapta].second) + 1LL * sir[dreapta].second * sir[dreapta].second; //cout << minim[dreapta][secvente] << ' '; } //cout << '\n'; } long long rezultat = 1000000000000000LL; for (int secvente = 1 ; secvente <= limita ; secvente++) { rezultat = min(rezultat , minim[dorit][secvente]); } return rezultat; }

컴파일 시 표준 에러 (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 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...