Informatyczny kącik olimpijski
Czworokąty wypukłe
W tym kąciku zajmiemy się zadaniem Quadrilaterals z obozu w Petrozawodsku w 2006 roku. Na płaszczyźnie dane jest punktów w położeniu ogólnym (tzn. żadna trójka punktów nie leży na jednej prostej). Należy wyznaczyć liczbę czworokątów wypukłych, których wierzchołki znajdują się wśród podanych punktów.
Aby sprawdzić, czy punkty mogą być kolejnymi wierzchołkami czworokąta wypukłego w porządku przeciwnym do kierunku ruchu wskazówek zegara, wystarczy zbadać, czy każda trójka kolejnych punktów tworzy zakręt w lewo. W tym celu można zbadać znak iloczynu wektorowego:
Sprawdzając wszystkie możliwe czwórki uporządkowane, liczbę „dobrych czwórek” możemy wyznaczyć w czasie Liczbę czworokątów wypukłych uzyskamy, dzieląc liczbę „dobrych czwórek” przez 4 (bierzemy poprawkę na obroty cykliczne).
Aby otrzymać szybsze rozwiązanie, skorzystamy z pewnego pomysłowego triku. Rozważmy dowolną nieuporządkowaną czwórkę punktów (w położeniu ogólnym) i zastanówmy się, jakie czworokąty można na niej zbudować. W zależności od wzajemnego ustawienia punktów mamy dwa przypadki (patrz Rys. 1): albo wszystkie punkty leżą na brzegu otoczki wypukłej (przypadek A), albo trzy punkty leżą na brzegu otoczki wypukłej, a czwarty punkt w środku (przypadek B). Łatwo przekonać się, że w pierwszym przypadku czwórka punktów wyznacza jeden czworokąt wypukły, natomiast w drugim przypadku dostajemy trzy różne czworokąty wklęsłe.
Powiemy, że para punktów tworzy przecięcie z parą punktów jeśli punkty leżą po różnych stronach prostej wyznaczonej przez punkty Zauważmy, że czwórka punktów z przypadku A generuje nam dwa przecięcia (gdy za punkty weźmiemy przeciwległe wierzchołki czworokąta wypukłego), natomiast w przypadku B są to trzy przecięcia (gdy jeden z punktów leży w środku otoczki wypukłej). Niech będzie liczbą wszystkich przecięć w zadanym zbiorze punktów, natomiast i będą liczbą czwórek punktów tworzących układy odpowiednio typu A i typu B. Możemy napisać następujący układ równań:
Rozwiązując ten układ, dostajemy, że liczba czworokątów wypukłych to (przy okazji: liczba wszystkich czworokątów to ).
Pozostaje pokazać, jak wyznaczyć liczbę Jeśli dla ustalonej pary punktów dokładnie punktów leży po jednej stronie prostej i punktów leży po drugiej stronie tej prostej, to mamy przecięć zawierających parę Rozważając każdą taką parę osobno, uzyskujemy czas
Szybciej wyznaczymy korzystając z metody zamiatania. Ustalmy punkt i przesuńmy punkty na płaszczyźnie tak, żeby środek układu współrzędnych znalazł się w Dla każdego innego punktu wyznaczmy kąt jaki tworzy półprosta z osią Niech będzie listą tych punktów posortowaną rosnąco względem kątów czyli względem kątów, jakie tworzy prosta z osią Na początku przyjmujemy i wyznaczamy liczby i punktów, które leżą powyżej i poniżej prostej (tj. odpowiednio na lewo i na prawo od wektora ). W każdym kolejnym kroku zmieniamy punkt na i uaktualniamy i (patrz Rys. 2):