Compito
Ti verrà dato un set di cerchi nel piano con i loro centri sulla linea y = 0 . È garantito che nessuna coppia di cerchi ha più di un punto comune.
Il tuo compito è determinare in quante regioni in cui i cerchi dividono il piano. Una regione è un insieme contiguo di punti inclusione-massima che non interseca nessuno dei cerchi.
Dovresti scrivere un programma che calcola questa risposta quando ti viene data una descrizione dei cerchi.
Ecco un esempio:

Sul lato sinistro puoi vedere i cerchi disegnati sul piano. Tuttavia, nella metà destra dell'immagine, le regioni prodotte dai cerchi sono colorate distintamente (un colore per regione). Ci sono sei regioni in questo esempio.
Ingresso
La prima riga dell'input contiene un numero N, il numero di descrizioni dei cerchi da seguire. Questa linea è facoltativa, se la tua soluzione funziona senza di essa, va bene.
Le seguenti Nlinee ciascuna contengono due numeri interi, x i e r i > 0 , che rappresenta un cerchio con centro (x i , 0) e raggio r i .
È garantito che nessuna coppia di cerchi ha più di un punto comune. Si è ulteriormente garantito che x i e r io non supero 10^9in valore assoluto (in modo da adattarsi comodamente in un intero a 32 bit).
L'input può essere:
letto da STDIN
letto da un file chiamato
Inella directory corrente
In alternativa, l'input potrebbe essere:
disponibile come stringa (comprese le nuove righe) in una variabile globale
sullo stack
Produzione
Questo dovrebbe essere un singolo numero intero, il numero per le regioni prodotte. Questo dovrebbe essere scritto su STDOUT o su un file chiamato Onella directory corrente.
Regole
Vince il codice più breve in byte
+200 byte di penalità se il codice non ha un polinomio di runtime + spazio in
nBonus di -100 byte per runtime previsto nel caso peggiore + complessità dello spazio
O(n log n)Bonus di -50 byte per runtime previsto nel caso peggiore + complessità dello spazio
O(n)Bonus di -100 byte per runtime deterministico + complessità dello spazio
O(n)
Durante la valutazione del runtime:
Supponiamo che le tabelle hash abbiano
O(1)previsto il runtime per l'inserimento, l'eliminazione e la ricerca, indipendentemente dalla sequenza di operazioni e dai dati di input. Ciò può essere vero o no, a seconda che l'implementazione utilizzi la randomizzazione.Supponiamo che il tipo incorporato del tuo linguaggio di programmazione richieda
O(n log n)tempo deterministico , dov'ènla dimensione della sequenza di input.Supponiamo che le operazioni aritmetiche sui numeri di input richiedano solo
O(1)tempo.Non dare per scontato che i numeri di input siano vincolati da una costante, sebbene, per ragioni pratiche, lo siano. Ciò significa che algoritmi come il radix sort o il counting sort non sono tempi lineari. In generale, dovrebbero essere evitati fattori costanti molto grandi.
Esempi
Ingresso:
2
1 3
5 1
Produzione: 3
Ingresso:
3
2 2
1 1
3 1
Produzione: 5
4
7 5
-9 11
11 9
0 20
Ingresso:
9
38 14
-60 40
73 19
0 100
98 2
-15 5
39 15
-38 62
94 2
Produzione: 11
suggerimenti
Possiamo usare la seguente idea per una soluzione molto compatta. Consente di intersecare l'insieme di cerchi con l'asse X e interpretare i punti di intersezione come nodi in un grafico planare:

Ogni cerchio produce esattamente 2 bordi in questo grafico e fino a due nodi. Possiamo contare il numero di nodi usando una tabella hash per tenere traccia del numero totale di bordi distinti a sinistra o a destra.
Quindi possiamo usare la formula caratteristica di Eulero per calcolare il numero di facce di un disegno del grafico:
V - E + F - C = 1
F = E - V + C + 1
Per calcolare Cil numero di componenti collegati, possiamo usare una ricerca approfondita .
Nota: questa idea del problema è presa in prestito da un recente concorso di programmazione croato , ma per favore non imbrogliare guardando i contorni della soluzione. :)
n log nbonus? Inoltre, ho una nuova soluzione concettualmente nuova. Devo pubblicare una nuova risposta per sostituire quella precedente? (Preferirei la prima, nel caso in cui la mia nuova soluzione non fosse effettivamente corretta)
