Soste in autostrada (autogrill) aiuto

#include <bits/stdc++.h>
using namespace std;

set<long long> s;
long long k;
auto itr = s.begin();

void inizia() {
  return;
}

void apri(long long p) {
  s.insert(p);
  return;
}

void chiudi(long long p) {
  s.erase(p);
  return;
}

long long chiedi(long long p) {
  if(s.empty()) return -1;
  else{
    itr = s.lower_bound(p);
    if(p>*itr){
        itr = s.end();
        itr--;
    } 
    k = *itr;
  }

    return k;
}    

sincero, so che sto dimenticando qualcosa, perchè l’algoritmo riesce solo nelle task base, ma dopo svariati tentativi, e vedendo che con esempi dati da me l’output è sempre corretto, non ho idea di cosa io abbia sbagliato. Mi sto allenando tanto per l’ultima gara, quindi se riuscite a farmi capire per bene l’errore vi sarei molto grato, grazie in anticipo.

Prova con questo testcase:

3
a 5
a 20
q 6

Il tuo codice stampa 20, mentre l’autogrill aperto più vicino al km6 è il 5.

1 Mi Piace
#include <bits/stdc++.h>
using namespace std;

set<long long> s;
long long k;
auto itr = s.begin();
auto tri = itr;

void inizia() {
  return;
}

void apri(long long p) {
  s.insert(p);
  return;
}

void chiudi(long long p) {
  s.erase(p);
  return;
}

long long chiedi(long long p) {
  if(s.empty()) return -1;
  else{
    itr = s.lower_bound(p);
    tri=itr;
    tri--;
    if(abs(p-*itr)<=abs(p-*tri)) return *itr;
    else return *tri;
  }
}    

grazie mille,
adesso ho aggiustato creando un altro iteratore, e inizializzandolo al primo. In questo modo alla fine faccio il confronto tra il primo numero >= p, e il primo numero <p. In questo modo sono riuscito a fare 13/20 subtasks. ma ancora non tutte. Ci ho riflettuto su una 30 di min ma non riesco ancora a trovare il bug. Ogni idea è ben accetta.

Prova a considerare questi due casi:

  • Cosa succede se non esiste un elemento >= p?
  • Cosa succede se lower_bound ti ritorna il primo elemento del set?

100/100 ti stimo.