Informatyczny kącik olimpijski
Piramidy
Tym razem omówimy zadanie z XII OIG.
Zadanie. Dana jest prostokątna plansza o wymiarach
Wiersze zostały ponumerowane od 1 do
zaś kolumny od 1 do
Pole
znajduje się w lewym górnym rogu planszy. Niektóre pola mają przypisaną wartość
pozostałe wartość 0 (
oznacza wartość pola
). Zerowym kwadratem nazywamy kwadrat, który pokrywa tylko zera. Dla każdej liczby całkowitej
z przedziału
należy policzyć, ile jest zerowych kwadratów o boku
Wstęp
Naszym zadaniem jest obliczenie wartości gdzie
oznacza liczbę zerowych kwadratów o boku
Załóżmy przez chwilę, że dla każdego pola
mamy obliczoną wartość
- rozmiar największego zerowego kwadratu, którego prawym dolnym rogiem jest pole
Zauważmy, że pole
jest również prawym dolnym rogiem zerowych kwadratów o boku:
Rozważmy teraz ciąg
gdzie
oznacza liczbę wystąpień wartości
w tablicy
Wówczas
Sumy prefiksowe
Niech oznacza sumę wartości w prostokącie, którego lewe górne pole ma współrzędne
zaś prawe dolne
Formalnie:
Obliczenie tablicy sum prefiksowych można zrealizować w czasie liniowym względem rozmiaru prostokąta, korzystając z poniższych zależności:
;
dla
;
dla
;
jest sumą: wartości pola
prostokąta bez ostatniego wiersza, prostokąta bez ostatniej kolumny, pomniejszoną o sumę prostokąta bez ostatniego wiersza i ostatniej kolumny, który został dodany dwa razy.

Zastanówmy się teraz, jak za pomocą tablicy sum prefiksowych obliczyć sumę wartości w prostokącie w czasie stałym. Niech będą prostokątami, których lewe górne pole ma współrzędne
zaś prawe dolne pole zostało wskazane na poniższym rysunku.

Załóżmy, że chcemy obliczyć sumę wartości w kolorowym prostokącie. Jest to gdzie
oznacza sumę wartości w prostokącie
Rozwiązanie
W tym podejściu wyznaczymy wartości tablicy przy wykorzystaniu metody wyszukiwania binarnego po wyniku. Załóżmy, że chcemy obliczyć wartość
dla ustalonych
Jeśli
wtedy
W przeciwnym przypadku
jest liczbą całkowitą z przedziału
Tę wartość możemy wyszukać binarnie po wyniku, korzystając z faktu:
Fakt. Jeśli jest prawym dolnym rogiem zerowego kwadratu o boku
to jest również prawym dolnym rogiem każdego mniejszego zerowego kwadratu.
Sprawdzenie, czy jest prawym dolnym rogiem zerowego kwadratu o boku
można wykonać za pomocą sum prefiksowych w czasie
Algorytm wyszukiwania binarnego wykona
takich faz. Wszystkich pól jest
zatem wyznaczenie tablicy
działa w czasie
Rozwiązanie dynamiczne
W tym podejściu wyznaczymy wartości tablicy przy wykorzystaniu metody programowania dynamicznego. Załóżmy, że chcemy obliczyć wartość
dla ustalonych
Jeśli
wtedy
W przeciwnym przypadku rozpatrujemy następujące możliwości.
- Jeśli
lub
wtedy
Dla wszystkich pól w pierwszym wierszu oraz w pierwszej kolumnie największy kwadrat ma rozmiar
- Jeśli
oraz
wtedy

- Jeśli
oraz
wtedy
gdzie
zaś
jeśli
i
w przeciwnym przypadku.

Obliczenie wartości dla ustalonego
odbywa się w czasie
Plansza ma
pól, zatem wyznaczenie tablicy
działa w czasie