Informatyczny kącik olimpijski
Zapotrzebowanie na prąd
W tym kąciku spróbujemy rozwiązać zadanie Electric needs pochodzące z drużynowych zawodów studenckich z serii ACM ICPC, a konkretnie z mistrzostw Ameryki Łacińskiej 2010.
Zadanie. Rozważmy prostokątny obszar podzielony na kwadraty jednostkowe, w którym kolumny ponumerowane są od do a wiersze od do Każdy kwadrat jednostkowy reprezentuje działkę, która może być zajęta przez budynek lub nie. Na dokładnie działkach, których współrzędne mamy podane, znajdują się budynki elektrowni. Wszystkie pozostałe pola są uszeregowane wedle swej wartości dla przedsiębiorców. Pola położone bliżej elektrowni są bardziej wartościowe od wszystkich odleglejszych (bierzemy pod uwagę odległość od najbliższego pola zajętego przez elektrownię w metryce maksimum, tzn. ). W przypadku jednakowej odległości od elektrowni za bardziej wartościowe uznajemy pola z wierszy o mniejszych numerach, a gdy także to kryterium nie jest rozstrzygające – z kolumn o mniejszych numerach. Naszym zadaniem jest odpowiedzieć na zapytań postaci: „podaj współrzędne pola, które jest -te z kolei na liście najbardziej wartościowych”.
Naturalnym podejściem jest wyznaczenie odległości każdego pola od elektrowni. Można to zrobić, budując graf nieskierowany, którego wierzchołkami są nasze pola, a krawędzie łączą pola sąsiadujące bokiem lub rogiem. W takim grafie wystarczy wykonać jedno przeszukiwanie wszerz (BFS), startując ze wszystkich pól elektrowni naraz. Zachęcamy Czytelnika, aby zastanowił się, dlaczego odległość w takim grafie jest równoważna odległości w metryce maksimum. Obliczywszy wszystkie odległości, sortujemy pola według kryteriów podanych w zadaniu, a na każde zapytanie odpowiadamy, po prostu podając współrzędne -tego pola z posortowanej listy. Daje to łącznie operacji albo nawet operacji, jeśli sortowanie wykonamy metodą kubełkową. Prawdopodobnie byłby to najlepszy sposób postępowania, gdyby nie fakt, że w tym zadaniu górne ograniczenia na i są dużo większe niż na i Innymi słowy, szukamy rozwiązania, którego złożoność będzie zależała bardziej od i niż czy
W takim razie zastanówmy się najpierw, w jakiej odległości od najbliższej elektrowni położone jest szukane, -te pole. Nie widać sposobu na obliczenie tego wprost, spróbujmy wyszukać wynik binarnie. W tym celu potrzebujemy metody sprawdzania, ile jest pól, których odległość od elektrowni wynosi co najwyżej – za jej pomocą wyszukamy najmniejszą wartość taką że tych pól jest co najmniej Zauważmy, że pola, których odległość od ustalonego pola elektrowni wynosi co najwyżej tworzą kwadrat o boku (kwadrat może być ucięty, jeśli wystaje poza planszę) i środku w elektrowni. Stąd musimy obliczyć, ile pól łącznie zajmuje takich kwadratów (względnie prostokątów). Tym problemem zajmiemy się za chwilę, póki co spójrzmy, jak ma się to do rozwiązania całego zadania. Jeśli znamy już odległość obliczamy najpierw, ile jest pól w odległości co najwyżej od elektrowni, odejmujemy tę liczbę od uzyskując nowy parametr i rozwiązujemy powstały problem: które z pól odległych od najbliższej elektrowni o dokładnie jest na pozycji -tej na liście tychże pól w zadanej kolejności. Zacznijmy od ustalenia, w którym wierszu jest nasz -ty element. Znów nie widać sposobu na obliczenie tego wprost, więc decydujemy się na wyszukiwanie binarne. Potrzebujemy odpowiedzi na pytanie: „ile jest pól odległych od najbliższej elektrowni o dokładnie które znajdują się w pierwszych wierszach?”. Naturalnie, będziemy szukali najmniejszego takiego że odpowiedź na to pytanie jest nie mniejsza niż Problem jest podobny do poprzedniego. Tym razem jednak odległość dokładnie od najbliższej elektrowni oznacza pola zawarte w kwadracie o boku ale niezawarte w kwadracie o boku Kwadraty te trzeba obcinać odpowiednio do prostokątów, jeśli wystają poza planszę (która ma teraz wymiary ). Ponieważ wszystkie mniejsze kwadraty zawierają się w większych, więc wystarczy obliczyć łączne pole sumy większych i odjąć od niego pole sumy mniejszych. Tak więc ponownie sprowadziliśmy problem do obliczenia pola sumy prostokątów. Na koniec pozostaje ustalić, które dokładnie z pól w danym wierszu należy wybrać. W tym celu od odejmujemy liczbę pól w odległości dokładnie od elektrowni, które znajdują się w wierszach o numerach od do otrzymując w ten sposób nowy parametr Następnie w identyczny sposób wyszukujemy binarnie minimalne takie żeby w pierwszych kolumnach wiersza o numerze było co najmniej pól o odległości od elektrowni równej Dla danego wystarczy obciąć kwadraty o bokach i do żądanej części wiersza o numerze a potem obliczyć różnicę sum pól powstałych prostokątów o jednym boku długości 1.
Sprowadziliśmy zatem cały problem do obliczenia pola sumy prostokątów razy. Można ten problem rozwiązać dość prosto w czasie lub co było wystarczające w tym zadaniu (opracowanie takich rozwiązań pozostawiamy Czytelnikowi). Istnieje też efektywniejsze rozwiązanie, w złożoności czasowej wykorzystujące technikę zamiatania oraz drzewo przedziałowe, w którym w każdym węźle pamiętamy dodatkowo długość sumy przedziałów w jego poddrzewie. Szczegóły tego rozwiązania pomijamy, można o nim posłuchać na stronie http:/was.zaa.mimuw.edu.pl/?q=node/37, poczytać w książce Preparaty i Shamosa Geometria obliczeniowa. Wprowadzenie albo, najlepiej, wymyślić je samemu.
Rozwiązanie całego zadania wymaga zatem operacji.