Przeskocz do treści

Delta mi!

Informatyczny kącik olimpijski

Zapotrzebowanie na prąd

Tomasz Kulczyński

o artykule ...

  • Publikacja w Delcie: kwiecień 2011
  • Publikacja elektroniczna: 31-03-2011

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 math do math  a wiersze od math do math  Każdy kwadrat jednostkowy reprezentuje działkę, która może być zajęta przez budynek lub nie. Na dokładnie math 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. math). 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 math  zapytań postaci: „podaj współrzędne pola, które jest math -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 math -tego pola z posortowanej listy. Daje to łącznie math  operacji albo nawet math  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 math  i math  są dużo większe niż na math i math  Innymi słowy, szukamy rozwiązania, którego złożoność będzie zależała bardziej od math i math  niż math  czy math

W takim razie zastanówmy się najpierw, w jakiej odległości od najbliższej elektrowni położone jest szukane, math -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 math  – za jej pomocą wyszukamy najmniejszą wartość math  taką że tych pól jest co najmniej math  Zauważmy, że pola, których odległość od ustalonego pola elektrowni wynosi co najwyżej math  tworzą kwadrat o boku math  (kwadrat może być ucięty, jeśli wystaje poza planszę) i środku w elektrowni. Stąd musimy obliczyć, ile pól łącznie zajmuje math 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ść math  obliczamy najpierw, ile jest pól w odległości co najwyżej math  od elektrowni, odejmujemy tę liczbę od math  uzyskując nowy parametr math  i rozwiązujemy powstały problem: które z pól odległych od najbliższej elektrowni o dokładnie math  jest na pozycji math -tej na liście tychże pól w zadanej kolejności. Zacznijmy od ustalenia, w którym wierszu jest nasz math -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 math  które znajdują się w pierwszych math  wierszach?”. Naturalnie, będziemy szukali najmniejszego takiego math  że odpowiedź na to pytanie jest nie mniejsza niż math  Problem jest podobny do poprzedniego. Tym razem jednak odległość dokładnie math  od najbliższej elektrowni oznacza pola zawarte w kwadracie o boku math  ale niezawarte w kwadracie o boku math  Kwadraty te trzeba obcinać odpowiednio do prostokątów, jeśli wystają poza planszę (która ma teraz wymiary math ). 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 math  odejmujemy liczbę pól w odległości dokładnie math  od elektrowni, które znajdują się w wierszach o numerach od math do math  otrzymując w ten sposób nowy parametr math  Następnie w identyczny sposób wyszukujemy binarnie minimalne takie math  żeby w pierwszych math  kolumnach wiersza o numerze math  było co najmniej math  pól o odległości od elektrowni równej math  Dla danego math  wystarczy obciąć kwadraty o bokach math  i math  do żądanej części wiersza o numerze math  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 math prostokątów math razy. Można ten problem rozwiązać dość prosto w czasie math  lub math  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 math 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 math  operacji.