## **A: Rep-ore-ting**
### Cel:
Si dla każdej z T gdzie Si będzie liczbą uporządkowanych par pracowników
(x,y) tak, że pracownik x może bezpośrednio lub pośrednio otrzymywać raporty od pracownika y po utworzeniu pierwszych i par partnerskich
Mamy wypluć iloczyn Si … m mod 1,000,000,007.
### Rozwiązanie:
Do Si zawsze musimy doliczyć $N(N−1)/2$ bo każdy pracownik może raportować pracownikowi wyżej. Żeby obliczyć pary które mogą się ze sobą komunikować pomimo że komunikująca osoba ma stopień wyżej niż otrzymująca komunikat.
Spróbujemy dla i-tej pary podzielić pracowników na grupy tż. każdy pracownik w jednej grupie może komunikować się z resztą w tej grupie.
Potem jeżeli dodamy relację pomiędzy pracownikami z dwóch różnych grup to będziemy musieli je zmergować. Czyli Union Find $O((N+M)log(N))$
## B: **Auth-ore-ization**
$N$ - długość planszy, $M$ - liczba pracowników
### Cel:
Iloczyn $D_i$. $D_i$ - minimalna liczba kroków dla pracownika i tż. dojdzie on do docelowego pokoju
### Rozwiązanie:
Najpierw zaznaczamy do których pokoi może wejść agent $L_i$. Skoro mamy planszę $3xN$ podróżując z jednego punktu do drugiego nie będziemy mieli momentu w którym wystąpiłaby potrzeba zrobienia "podkowy", oprócz momentów końcowych.
Możliwości ruchów wyglądają tak:
a) Idziemy z $(R1_i,C1_i)$ do $(R1_i,a)$ - pierwsze ruchy
b) Idziemy z $(R1_i,a)$ do $(R2_i,b)$ - środek
c) Idziemy z $(R2_i,b)$ do $(R2_i,C2_i)$ - ostatnie ruchy
Dla pierwszego i ostatniego przypadku trzymamy set wierszy, które można przejść w całości (są wypełnione jedynkami). Chcemy wtedy znaleźć piewszy pełny wiersz nad startem / pod celem.
Dla drogi pomiędzy będziemy trzymać drzewo przedziałowe postawione na liczbie wierszy. Wierzchołek i będzie trzymać macierz 3x3 mówiący jaka jest najkrótsza droga pomiędzy przedziałami $x_i$ $y_i$ przechodząca przez a i b używając ruchów prawo/lewo/dół.
Przerabiamy pracowników rosnąco. Każde zaznaczenie punktu na dostępny to update na drzewie w punkcie. Złożoność: $O((N+M)log(N))$
## C: Perf-ore-mance
### Cel:
Maksymalna możliwa liczba pracowników, których zarobki możemy określić.
### Rozwiązanie:
Możemy patrzeć na strukturę firmy jak na drzewo, gdzie niżej od pracownika $i$ są tylko jego podwładni. Możemy określić zarobki pracownika i wtedy gdy:
a) ojciec $i$ ma jednego syna i poddrzewo $i$ jest większe równe $K$
b) ojciec $i$ ma dwóch synów, poddrzewo dziadka $i$ jest większe równe $K$ oraz dla innych synów dziadka wielkości poddrzew wynoszą 1 albo są większe od $K$. Użyjemy programowania dynamicznego w postaci $DP[wierzchołek][wielkośćPoddrzewa ]$. - maksymalna liczba ludzi w poddrzewie, których pensję możemy obliczyć.