Aufgabe
Sie erhalten eine Reihe von Kreisen in der Ebene mit ihren Mittelpunkten auf der Linie y = 0 . Es ist garantiert, dass kein Kreispaar mehr als einen gemeinsamen Punkt hat.
Sie müssen bestimmen, in wie viele Bereiche die Kreise die Ebene unterteilen. Eine Region ist eine einschlussmaximale zusammenhängende Menge von Punkten, die keinen der Kreise schneiden.
Sie sollten ein Programm schreiben, das diese Antwort berechnet, wenn Sie eine Beschreibung der Kreise erhalten.
Hier ist ein Beispiel:

Auf der linken Seite sehen Sie die in der Ebene gezeichneten Kreise. In der rechten Bildhälfte sind die durch die Kreise erzeugten Bereiche jedoch deutlich gefärbt (eine Farbe pro Bereich). In diesem Beispiel gibt es sechs Regionen.
Eingang
Die erste Zeile der Eingabe enthält eine Zahl N, die Anzahl der folgenden Kreisbeschreibungen. Diese Zeile ist optional. Wenn Ihre Lösung ohne sie funktioniert, ist dies in Ordnung.
Die folgenden NZeilen enthalten jeweils zwei Ganzzahlen, x i und r i > 0 , die einen Kreis mit Mittelpunkt (x i , 0) und Radius r i darstellen .
Es ist garantiert, dass kein Kreispaar mehr als einen gemeinsamen Punkt hat. Es ist weiterhin garantiert, dass x i und r i den10^9 absoluten Wert nicht überschreiten (so dass sie bequem in eine 32-Bit-Ganzzahl passen).
Die Eingabe kann sein:
aus STDIN lesen
Aus einer Datei
Iim aktuellen Verzeichnis lesen
Alternativ könnte die Eingabe sein:
Verfügbar als Zeichenfolge (einschließlich Zeilenumbrüchen) in einer globalen Variablen
auf dem Stapel
Ausgabe
Dies sollte eine einzelne Ganzzahl sein, die Anzahl der produzierten Regionen. Dies sollte in STDOUT oder in eine Datei geschrieben werden, die Oim aktuellen Verzeichnis benannt ist.
Regeln
Kürzester Code in Bytes gewinnt
+200 Byte Strafe, wenn Ihr Code kein Laufzeit- + Raumkomplexitätspolynom enthält
n-100-Byte-Bonus für die im schlimmsten Fall zu erwartende Laufzeit + Speicherplatzkomplexität
O(n log n)-50-Byte-Bonus für die im schlimmsten Fall zu erwartende Laufzeit + Speicherplatzkomplexität
O(n)-100-Byte-Bonus für deterministische Laufzeit + Speicherplatzkomplexität
O(n)
Bei der Beurteilung der Laufzeit:
Angenommen, Hash-Tabellen haben
O(1)unabhängig von der Reihenfolge der Operationen und den Eingabedaten eine erwartete Laufzeit für das Einfügen, Löschen und Nachschlagen. Dies kann wahr sein oder nicht, abhängig davon, ob die Implementierung eine Randomisierung verwendet.Angenommen, die eingebaute Art Ihrer Programmiersprache benötigt deterministische
O(n log n)Zeit, wobeindie Größe der Eingabesequenz angegeben wird.Nehmen wir an, dass arithmetische Operationen an Eingabenummern nur
O(1)Zeit in Anspruch nehmen .Nehmen Sie nicht an, dass Eingabezahlen durch eine Konstante gebunden sind, obwohl dies aus praktischen Gründen der Fall ist. Dies bedeutet, dass Algorithmen wie radix sort oder counting sort keine lineare Zeit sind. Im Allgemeinen sollten sehr große konstante Faktoren vermieden werden.
Beispiele
Eingang:
2
1 3
5 1
Ausgabe: 3
Eingang:
3
2 2
1 1
3 1
Ausgabe: 5
4
7 5
-9 11
11 9
0 20
Eingang:
9
38 14
-60 40
73 19
0 100
98 2
-15 5
39 15
-38 62
94 2
Ausgabe: 11
Hinweise
Wir können die folgende Idee für eine sehr kompakte Lösung verwenden. Lässt uns die Menge der Kreise mit der X-Achse schneiden und die Schnittpunkte als Knoten in einem ebenen Graphen interpretieren:

Jeder Kreis erzeugt in diesem Diagramm genau 2 Kanten und bis zu zwei Knoten. Wir können die Anzahl der Knoten zählen, indem wir eine Hash-Tabelle verwenden, um die Gesamtzahl der unterschiedlichen linken oder rechten Ränder zu verfolgen.
Dann können wir die Euler-Kennlinienformel verwenden , um die Anzahl der Flächen einer Zeichnung des Graphen zu berechnen:
V - E + F - C = 1
F = E - V + C + 1
Um Cdie Anzahl der verbundenen Komponenten zu berechnen , können wir eine Tiefensuche verwenden .
Hinweis: Diese Problemidee stammt aus einem kürzlich durchgeführten kroatischen Programmierwettbewerb. Betrügen Sie jedoch nicht, indem Sie sich die Lösungsskizzen ansehen. :)
n log nBonus zu erhalten. Außerdem habe ich neue konzeptionell neue Lösungen. Sollte ich eine neue Antwort posten oder die alte ersetzen? (Ich würde die frühere vorziehen, falls meine neue Lösung nicht wirklich korrekt ist)
