Nehmen wir an, dass wir eine Datenstruktur haben, die effizient die folgenden Operationen unterstützt:
ein Segment hinzufügen.
Löschen eines Segments.
Gibt die maximale Anzahl der Segmente zurück, die einen Punkt abdecken (dh der "beste" Punkt).
Wenn eine solche Struktur haben, können wir das ursprüngliche Problem effizient auf die folgende Weise verwenden erhalten:
Lassen Sie uns eine Reihe von Ereignissen erstellen (ein Ereignis für den Beginn jedes Segments und ein für das Ende) und nach der x-Koordinate sortieren.
Fügen Sie der magischen Datenstruktur alle Segmente hinzu.
Iterieren Sie alle Ereignisse und gehen Sie folgendermaßen vor: Wenn ein Segment beginnt, fügen Sie eins zur Anzahl der aktuell abgedeckten Segmente hinzu und entfernen Sie es aus dieser Datenstruktur. Wenn ein Segment endet, subtrahiere eins von der Anzahl des aktuell abgedeckten Segments und füge dieses Segment der magischen Datenstruktur hinzu. Aktualisieren Sie nach jedem Ereignis die Antwort mit dem Wert der Anzahl der aktuell abgedeckten Segmente (es wird angezeigt, wie viele Segmente von dem Punkt abgedeckt werden, der dem aktuellen Ereignis entspricht) plus dem von der oben beschriebenen Datenstruktur zurückgegebenen Maximum (es zeigt, wie wir kann einen anderen Punkt auf die bestmögliche Weise wählen).
Wenn diese Datenstruktur alle angegebenen Operationen in O(log n)
durchführen kann, dann haben wir eine O(n log n)
Lösung (wir die Ereignisse sortieren und zu einem Durchgang über die sortierten Array machen eine konstante Anzahl von Abfragen an diese Datenstruktur für jede Herstellung Veranstaltung).
Wie können wir diese Datenstruktur implementieren? Nun, ein Segmentbaum funktioniert hier gut. Durch das Hinzufügen eines Segments wird ein Segment zu einem bestimmten Bereich hinzugefügt. Durch das Entfernen eines Segments wird eins von allen Elementen in einem bestimmten Bereich subtrahiert. Das Maximum ist nur eine Standardmaximaloperation in einem Segmentbaum. Daher benötigen wir einen Segmentbaum, der zwei Operationen unterstützt: Fügen Sie eine Konstante zu einem Bereich hinzu und erhalten Sie den Maximalwert für die gesamte Struktur. Es kann in O(log n)
Zeit pro Abfrage durchgeführt werden.
Noch ein Hinweis: Ein Standard-Segmentbaum erfordert Koordinaten klein sein. Wir können davon ausgehen, dass sie niemals 2 * n
überschreiten (wenn dies nicht der Fall ist, können wir sie komprimieren).
'mit genau zwei Linien senkrecht them'? also diese beiden Linien werden parallel zur y-Achse, müssen sie die x-Achse in ganzzahligen Punkt kreuzen? –
@PhamTrung, ja, es muss entweder gekreuzt oder berührt sein. – inquisitive
In ** Ganzzahl ** Punkt? oder irgendeinen Punkt? –