Allenamento pre-oii Skyline2

Gli ultimi allenamenti prima della fase nazionale stanno per finire e ho incontrato un problema enorme nel riuscire a risolvere Skyline2: pur avendolo risolto sulla carta,non riuscivo infatti a capire come riuscire ad accedere dalla funzione Cambia (quella che doveva restituire 0 o 1 a seconda dei casi) al vettore altezze dichiarato solo in locale dento al main.Come si doveva fare?

Puoi dichiarare variabili globali o funzioni aggiuntive, quindi basta creare un altro vettore e usare quello.

Ho provato anch’io a fare così ma mi diceva che superavo i mermory limits

Con la funzione void Inizializza(int N, int M, int* H) ti veniva passato l’array H (o meglio, un puntatore al suo primo elemento).

Un modo per tenere un riferimento permanente ad H poteva essere salvare il puntatore in un’altra variabile dello stesso tipo:

int* h;
void Inizializza(int N, int M, int* H) {
    h = H;
    // altro codice
}

int Cambia(int P, int V) {
    // qui puoi usare h
}

Comunque, l’errore Execution killed with signal <numero> (could be triggered by violating memory limits) molto spesso, forse anche troppo spesso, non è legato alla quantità di memoria allocata. Per esempio vedi questo topic.

Come si faceva a copiare il vettore H in un vettore a di interi senza che mi restituisse l’errore?

int h[50002];
void Inizializza(int N, int M, int* H){
    for(int i=0;i<N;i++)
      h[i]=H[i];
}

Io ho fatto così e non mi ha dato nessun problema

Dando un’occhiata più attenta ho notato che in diverse submission hai ricevuto a volte il signal 8 e altre volte il signal 11. In particolare, nei casi in cui ricevevi signal 8, l’errore era dovuto ad una divisione per zero (per l’esattezza: un operazione di modulo con zero) mentre nei casi in cui ricevevi signal 11, l’errore era dovuto effettivamente alla troppa memoria utilizzata (l’array a che dichiaravi, facendo un rapido calcolo e tenendo conto che un int sono 4 byte, veniva ad occupare oltre 300 MiB, quando ne sono consentiti 256)