Na rozległej równinie pasie się $N$ rozproszonych kóz. Żadne dwie nie zajmują tego samego miejsca. Są leniwe: nie przemieszczają się, tylko czasem obracają w miejscu. W rzeczywistości wszystkie są robotami, które nie potrafią chodzić, a jedynie się obracać. Ich nosy to zdalnie zapalane diody LED, a oczy są wydajnymi kamerami. Obraz można zdalnie oglądać na żywo i zapisywać wybrane sceny. Koza widzi własny nos, a dzięki funkcji prześwietlania rozpoznaje liczbę kóz nawet wtedy, gdy nakładają się w obrazie. Poziomy kąt widzenia wynosi $180^\circ$ i obejmuje także jego granicę.
Zależnie od rozmieszczenia niektóre kozy mogą widzieć wszystkie $N$ kóz naraz, a inne nie mogą tego zrobić w żadnym kierunku. Na przykład dla sześciu kóz o numerach od $0$ do $5$ na rysunku koza $5$ widzi wszystkie sześć jednocześnie, ale koza $2$ nie może tego zrobić niezależnie od kierunku patrzenia.
Do specjalnego eksperymentu wybieramy dwie różne kozy, z których każda może widzieć wszystkie $N$ kóz naraz, oraz dowolną kozę spośród pozostałych. Zapalamy nosy wybranych trzech kóz, aby ich pozycje były rozpoznawalne z dowolnego miejsca. Obserwujemy obrazy z ich oczu i dla każdej zapisujemy jedną scenę, w której wszystkie trzy świecące kozy są widoczne w jednym kadrze. Oglądamy kolejno trzy zapisane sceny. W każdej oznaczamy trzy świecące kozy oraz wszystkie kozy widoczne pomiędzy pozostałymi dwiema świecącymi kozami, wraz z granicami. Celem eksperymentu jest policzenie, ile spośród $N$ kóz otrzymało oznaczenie we wszystkich trzech scenach.
Jeśli na przykład wybrane trzy spośród sześciu kóz oznaczymy czerwonymi punktami, poniższe rysunki pokazują kozy oznaczone z punktu widzenia każdej wybranej kozy. (Rysunki nie są samymi zapisanymi scenami.) W tym przypadku $4$ kozy otrzymują oznaczenie trzykrotnie.
Na potrzeby eksperymentu zaimplementuj następujące dwie funkcje.
void init( int x[], int y[] ): Funkcja wywoływana jako pierwsza, dokładnie raz. Tablice (wektory)xiymają rozmiar $N$. Argumentyx[0..N-1]iy[0..N-1]zawierają współrzędne $x$ i $y$ kóz. Koza $i$ ($0\le i\le N-1$) znajduje się w(x[i], y[i]).int count( int a, int b, int c ): Na podstawie współrzędnych(x[a], y[a]),(x[b], y[b]),(x[c], y[c])trzech podanych kóz oblicza i zwraca liczbę kóz oznaczonych wszystkie trzy razy.
Szczegóły implementacji
Prześlij jeden plik o nazwie goat.cpp, zawierający implementacje następujących funkcji.
void init( int x[], int y[] ); int count( int a, int b, int c );
Funkcje muszą działać zgodnie z opisem. Możesz definiować inne funkcje do użytku wewnętrznego. Przesłany kod nie może wykonywać operacji wejścia/wyjścia ani korzystać z innych plików.
Przykładowy program oceniający
Dostarczony program oceniający czyta wejście w następującym formacie.
- Pierwszy wiersz: $N\ Q$, gdzie $N$ jest liczbą kóz, a $Q$ liczbą zapytań.
- Każdy z kolejnych $N$ wierszy: $x\ y$, czyli współrzędne $x$ i $y$ kozy.
- Każdy z kolejnych $Q$ wierszy: $a\ b\ c$ ($a,b,c$), czyli numery trzech kóz, gdzie $0\le a,b,c\le N-1$.
Dla każdego zapytania program oceniający wypisuje liczbę kóz spełniających warunek w osobnym wierszu.
Ograniczenia
- $3\le N\le 3000$
- $1\le Q\le 5\times10^6$
- Współrzędne $x$ i $y$ wszystkich kóz należą do przedziału od $0$ do $10^9$ włącznie.
Podzadania
1 (5 punktów)
- $N\le 500$, $Q\le 10^5$
- Żadne trzy punkty nie są współliniowe.
2 (17 punktów)
- $N\le 500$, $Q\le 10^5$
3 (10 punktów)
- $N\le 500$
- Żadne trzy punkty nie są współliniowe.
4 (8 punktów)
- $N\le 500$
5 (29 punktów)
- Żadne trzy punkty nie są współliniowe.
6 (31 punktów)
- Brak dodatkowych ograniczeń.
Przykład
Wejście 1
6 3 0 0 1 1 2 2 4 3 0 2 2 0 0 5 2 1 3 4 4 1 5
Wyjście 1
4 4 3
Poniżej podano kolejno wywołania funkcji i wyniki dla przykładu 1.
| Wywołanie funkcji | Wynik |
|---|---|
init( {0, 1, 2, 4, 0, 2}, {0, 1, 2, 3, 2, 0} ) |
|
count( 0, 5, 2 ) |
4 |
count( 1, 3, 4 ) |
4 |
count( 4, 1, 5 ) |
3 |