La mia prima soluzione di oii_disegno non superava i testcase del subtask 0 (quelli presenti nel testo del problema) nonostante in locale producesse un output corretto.
Dopo ore di debugging e 24 submission con assert in diverse posizioni del codice sono giunto alla conclusione che il problema non era nella mia soluzione ma nel modo in cui il compilatore della piattaforma gestisce l’assegnamento nelle initializer list.
Si consideri il seguente codice:
#include <iostream>
#include <cassert>
using namespace std;
struct Point {
int x, y;
bool operator==(const Point &p) const {
return x == p.x && y == p.y;
}
};
struct Segment {
Point first, second;
bool operator==(const Segment &s) const {
return first == s.first && second == s.second;
}
};
int main() {
Point p = {-1, 42};
Segment s[10];
for (int i = 0; i < 10; i++)
s[i] = {p, p = {i, 42}};
Segment expected = {{4, 42}, {5, 42}};
assert(s[5] == expected);
cout << "assert superato" << endl;
return 0;
}
Compilando questo codice con gcc 13.2
(ultima versione) e C++ 17 il programma non presenta problemi e l’assert viene superato. Lo stesso vale per clang 16.0
(penultima versione).
Però non è così su cms: il risultato, causato dal fallimento dell’asserzione, è “Execution killed (could be triggered by violating memory limits)”.
Semplicemente spostando l’assegnazione dall’initializer list alla riga successiva la mia soluzione è passata da 0 a 100 punti.
Questo problema potrebbe essere essere dovuto al fatto che cms utilizza una versione non aggiornata di g++?