Pokazywanie postów oznaczonych etykietą algoliga. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą algoliga. Pokaż wszystkie posty

czwartek, 26 marca 2015

15465. Zawody w szacowaniu [AL_11_05]

Zadanie:
https://pl.spoj.com/problems/AL_11_05
https://spoj.com/ALGOLIGA/problems/AL_11_05

Skrócony opis problemu:
Dana jest plansza o rozmiarze $n$ w kształcie piramidy złożonego z kwadratowych pól. Następnie danych jest $t$ mniejszych lub równych piramid będących częścią planszy. Należy obliczyć obszar planszy pokryty owymi piramidami (czyli podać ilość kwadratów, które zostały przykryte $t$ piramidami). Oto przykładowa plansza z 2 naniesionymi piramidami (wynik to 8, bo mamy 8 zamalowanych kwadratów):


Rozwiązanie naiwne:
Możemy oczywiście utworzyć sobie tablicę dwuwymiarową reprezentującą planszę (na początku pustą) i dla każdej z $t$ piramid zamalowywać odpowiednie pola planszy, a na końcu je zliczyć.

Złożoność: $O(n^2 \cdot t)$, bo pesymistycznie każda piramida do zamalowania może mieć rozmiar bliski $n$, a piramida o rozmiarze $n$ składa się z $\frac{n \cdot (n+1)}{2}$ kwadratów. Na końcu przejście całej planszy również zajmie nam $\frac{n \cdot (n+1)}{2}$ operacji.

Rozwiązanie sprytne:
Bardziej ambitnym czytelnikom polecam nieczytanie poniższego rozwiązania, a spróbowanie najpierw dojście do niego samemu po sprawdzeniu jego złożoności, która została podana poniżej. Wydaje mi się, że złożoność sporo podpowie.

A zatem, na pewno nie możemy dla każdej piramidy zaznaczać w jej wszystkich kwadratów na planszy. Nie powinniśmy również wykonywać nawet $O(n)$ operacji dla pojedynczej piramidy, gdyż wtedy złożoność wyniosłaby $O(n^2 + t \cdot n)$, a i to jest za wolne przy ograniczeniach z zadania. Dla każdej piramidy musimy wykonać zatem albo stałą, albo logarytmiczną ilość operacji. Możemy też wywnioskować z ograniczeń z zadania, że po przetworzeniu wszystkich macierzy możemy nawet przejść całą planszę, kwadrat po kwadracie (bo n=5000, a kilkadziesiąt milionów operacji nie jest problemem).

Na początku myślałem, że trzeba dla każdego wiersza tworzyć jakieś drzewo, ale okazuje się, że nie! Możemy utworzyć pustą planszę i dla każdej piramidy po prostu zaznaczać w danej komórce rozmiar piramidy, która się w niej zaczyna. Czyli dla piramidy z przykładu, której rysunek znajduje się powyżej w komórce $a_{2, 1}$ znajdzie się liczba 2, a w komórce $a_{2, 2}$ znajdzie się liczba 3.

Przy zliczaniu, kiedy dojdziemy do jakiejś zajętej komórki, po prostu dodamy do wyniku 1 licząc jedynie szczyt piramidy, a następnie dodamy 2 piramidy, o 1 rozmiar mniejsze. Tak więc dla $a_{2, 1}$ wpiszemy w komórki $a_{3, 1}$ i $a_{3, 2}$ wartość 2-1=1, a w komórki $a_{3, 2}$ i $a_{3, 3}$ liczbę 3-1=2. Czyli dzielimy piramidę na: szczyt (złożony z 1 kwadratu), lewą podpiramidę o rozmiarze o 1 mniejszym i prawą podpiramidę o rozmiarze o 1 mniejszym. Jak widzimy, 2 razy zaktualizowaliśmy komórkę $a_{3, 2}$. Musimy pamiętać, że możemy aktualizować komórkę TYLKO na wartość większą. Dotyczy to również wczytywania. Czyli jeśli mamy w jakiejś komórce wartość 5, to możemy ją zmienić na 7, ale odwrotnie już nie (bo interesuje nas maksymalny obszar pokryty przez piramidy).

Złożoność: $O(t + n^2)$, bo dla każdej piramidy wykonujemy stałą ilość operacji, a na końcu przechodzimy planszę, która ma $\frac{n \cdot (n+1)}{2}$ pól.

Optymalizacja:
Jeśli rozmiar jakiejś piramidy będzie wynosił $n$, to wiemy już, że jest to maksymalna piramida pokrywająca całą planszę. Możemy wtedy wypisać $\frac{n \cdot (n+1)}{2}$ i zakończyć program.

czwartek, 20 listopada 2014

19887. Trzy posągi króla [AL_16_04]

Zadanie:
https://spoj.com/ALGOLIGA/problems/AL_16_04
https://pl.spoj.com/problems/AL_16_04

Skrócony opis problemu:
Mamy dane $t$ testów - każdy składa się z: $n$ i $m$ oraz 3 punktów: $P_1$, $P_2$, $P_3$. Zaczynając od punktu $(1, 1)$ i mogąc się poruszać tylko w prawo lub górę (czyli mogąc tylko zwiększać jedną ze współrzędnych) na ile sposobów można dojść do punktu $(n, m)$ tak, żeby przejść przez przynajmniej 1 punkt z 3 danych. Należy podać liczbę sposobów modulo $10^9+7$.

piątek, 14 listopada 2014

17137. DOMINO [AL_13_07]

Zadanie:
https://spoj.com/ALGOLIGA/problems/AL_13_07
https://pl.spoj.com/problems/AL_13_07

Skrócony opis problemu:
Dany jest ciąg $n$ kostek domina, których obie wartości zawierają się w przedziale 0..6. Kostki mogą się powtarzać. Należy obliczyć dla niego długość najdłuższego spójnego podciągu kostek, takiego że obracając (bez zamiany miejsc) w nim dowolną ilość kostek możemy otrzymać poprawny ciąg gry Domino, tj. taki, że każde 2 sąsiadujące kostki stykają się bokami o tej samej wartości. Np. dla poniższego ciągu odpowiedź to 3, bo jeśli obrócimy 2 i 4 kostkę to otrzymamy poprawny podciąg od kostki 2 do 4.
2|1 1|3 1|4 5|4

sobota, 4 października 2014

wtorek, 15 lipca 2014

20178. Wstążki [AL_17_03]

Zadania:
https://spoj.com/ALGOLIGA/problems/AL_17_03
https://pl.spoj.com/problems/AL_17_03

Skrócony opis problemu:
Mając $n$ wstążek o określonych długościach, należy podzielić je tak, by $m$ osób otrzymało kawałek i by zmaksymalizować najmniejszy z nich.

poniedziałek, 26 maja 2014

17205. Punkty w kole [AL_12_02]

Zadania:
http://pl.spoj.com/problems/AL_12_02
http://spoj.com/ALGOLIGA/problems/AL_12_02

Skrócony opis problemu:
Dla koła o danym $r \in \mathbb{N}$ oraz środku o współrzędnych całkowitych zliczyć ilość punktów o współrzędnych całkowitych leżących w lub na brzegu tego koła.
Jest to tzw. problem koła Gaussa (ang. Gauss circle problem).

piątek, 29 listopada 2013

17206. Gra w mnożenie [AL_12_03]

Zadanie:
http://spoj.com/ALGOLIGA/problems/AL_12_03
http://pl.spoj.com/problems/AL_12_03

Skrócony opis problemu:
Zaczynamy od $p=1$. Gracze A i B mnożą na przemian $p$ przez $x \in \left\lbrace 2,3,4,5,6,7,8,9\right\rbrace$ aż $p \ge n$. Gracz, który ostatni przemnoży $p$ wygrywa. Zaczyna gracz A. Naszym zadaniem jest określić który gracz wygra, zakładając, że obaj grają optymalnie.

17204. Winda [AL_12_01]

Zadanie:
http://spoj.com/ALGOLIGA/problems/AL_12_01
http://pl.spoj.com/problems/AL_12_01

Skrócony opis zadania:
Jest nam dany string (o długości $m$) opisujący historię operacji windy. Litera D oznacza, że winda pojechała jedno piętro w dół, a U oznacza, że pojechała do góry. Naszym zadaniem jest stwierdzić czy dana historia jest poprawna, czyli winda nie zjechała poniżej parteru (o numerze 1) lub nie wjechała powyżej najwyższego piętra (o numerze $n$).

poniedziałek, 25 listopada 2013

17207. Konkatenacja liczb [AL_12_04]

Zadanie:
http://spoj.com/ALGOLIGA/problems/AL_12_04
http://pl.spoj.com/ALGOLIGA/problems/AL_12_04

Skrócony opis problemu:
Dla podanych n liczb znaleźć taką ich konkatenację, by jej wartość była największa.

17211. Bajtomir na giełdzie [AL_12_08]

Zadanie:
http://spoj.com/ALGOLIGA/problems/AL_12_08
http://pl.spoj.com/problems/AL_12_08

Skrócony opis problemu:
Dla danego ciągu składającego się z $n$ liczb naturalnych znaleźć najdłuższy podciąg alternujący (ang. longest alternating subsequence). Jest to taki ciąg, dla którego kolejne wyrazy są na przemian rosnące i malejące. Np. 2,3,1 lub 5,1,99,42.

17215. Głuchy telefon epicykloidorów [AL_12_12]

Zadanie:
http://spoj.com/ALGOLIGA/problems/AL_12_12
http://pl.spoj.com/problems/AL_12_12

Skrócony opis problemu:
Mamy sobie koło, na którym jest $n$ równo-oddalonych od siebie punktów. Z każdego punktu może wyskoczyć epicykloidor i poruszając się o jakąś odległość $l_i$ może przemieścić się do dowolnego innego punktu. Mamy również daną listę wszystkich możliwych $l_i$ - jest ich $m$. Głuchy telefon polega na tym, że z punktu $a$ wyskakuje epicykloidor o jakimś $l_i$ i wskakuje do punktu oddalonego o $l_i$. Z tego punktu wyskakuje kolejny epicykloidor (możliwe, że o innym $l_j$) i wskakuje do punktu oddalonego o $l_j$. I tak aż osiągnie się punkt $b$. Dla każdego z $q$ zapytań należy wypisać liczbę możliwych ścieżek (nie dróg!) z punktu $a$ do punktu $b$ o długości $x$ skoków. (Będąc w punkcie $b$ epicykloidor może potraktować go jako punkt pośredni, a nie końcowy i wykonać jeszcze kilka skoków przed zakończeniem rundy w punkcie $b$). Punkty są mają wartości rosnące zgodnie z kierunkiem ruchu wskazówek zegara. Wynik należy podać modulo 1010101.

17214. Festyn w Bajtlandii [AL_12_11]

Zadanie:
http://spoj.com/ALGOLIGA/problems/AL_12_11
http://pl.spoj.com/problems/AL_12_11

Skrócony opis problemu:
Jest $n$ wież o danych wysokościach oraz $q$ zapytań.
TODO

17208. Bajtek w przedszkolu [AL_12_05]

Zadanie:
http://spoj.com/ALGOLIGA/problems/AL_12_05
http://pl.spoj.com/ALGOLIGA/problems/AL_12_05

Skrócony opis problemu:
Dla ciągu $n$ liter 'C' i $n$ liter 'K' wypisać najmniejszą sumę kosztów połączeń między literami 'C' z literami 'K', gdzie koszt połączenia to odległość między tymi literami. Np. koszt połączenia dla CK to 1, dla CXK to 2, dla CXXK to 3, itd. Dla CKCK wynik to 2, gdyż łączymy pierwsze C z pierwszym K i ostatnie C z ostatnim K.

wtorek, 27 sierpnia 2013

15157. Neptun [AL_07_08]

Zadanie:
https://pl.spoj.com/problems/AL_07_08

Skrócony opis problemu:
Mamy dane graf nieskierowany składający się z $v$ wierzchołków (ang. vertex), które numerujemy od 0 i $e$ krawędzi (and. edges). Następnie mamy podane $n$ i $n$ wierzchołków reprezentujących stolice państw, opisanych ich numerem oraz wartością $m$. Każda stolica podbija wszystkie sąsiednie i niepodbite jeszcze tereny (wierzchołki) po czasie $m$. Po czasie $2m$ każdy z nowopodbitych terenów podbija z kolei wszystkich swoich [niepoditych] sąsiadów, i tak do zużycia (podbicia) wszystkich wierzchołków. Następnie podana jest liczba $q$ (ang. query) oznaczająca ilość zapytań. Każde zapytanie składa się z dwóch liczb: $a$, $b$ i należy dla niego wypisać numer jednej ze $n$ stolic (numer, a nie wartość tak więc jeśli trzecią stolicą jest 5, to jej numerem jest 3), która okupuje w momencie $b$ teren (wierzchołek) $a$ Jeśli w momencie $b$ teren jest niezajęty, to należy wypisać "-". Jeśli w danej jednostce czasu jakiś teren chcą podbić dwie stolice to podbija go ta z mniejszym numerem.

niedziela, 25 sierpnia 2013

15159. Balony [AL_07_10]

Zadanie:
https://pl.spoj.com/problems/AL_07_10

Skrócony opis problemu:
Dane jest $n$ sal, $m$ pomocników oraz ilość uczestników konkursu $x_i$ w każdej z $n$ sal. W każdej sali musi być przynajmniej 1 pomocnik. Oblicz maksymalną ilość uczestników przypadającą na jednego pomocnika zakładając optymalne rozmieszczenie pomocników. Innymi słowy musisz tak poprzydzielać pomocników do sal, aby zminimalizować maksymalną ilość uczestników na pomocnika.
Np. dla $n=3, m=6$ i $x = [10, 30, 90]$ wynikiem jest 30, bo do pierwszej sali przydzielamy 1 pomocnika i: albo do drugiej 1, a do trzeciej 4 - wtedy w drugiej 1 pomocnik musi radzić sobie z 30 uczestnikami, albo do drugiej 2, a do trzeciej 3 - wtedy w trzeciej sali jest 3 pomocników na 90 uczestników (czyli każdy pomocnik ma przydzielonych 30 uczestników).

sobota, 24 sierpnia 2013

14400. Palindrom wielokrotny [AL_05_04]

Zadanie:
https://pl.spoj.com/problems/AL_05_04

Skrócony opis problemu:
Dla $t$ danych stringów znajdź dla każdego stringa $s_i$ jego krotność palindromiczną $k_i$, a następnie znajdź i wypisz medianę zbioru $k_i$.
Krotność palindromiczna jest zdefiniowana następująco:

  • jeśli wyraz nie jest palindromem, to jego krotność wynosi 0 - jest palindromem 0-krotnym
  • jeśli wyraz ma jedną literę, to jest palindromem 1-krotnym
  • jeśli wyraz $s$ jest palindromem $k$-krotnym, to wyrazy $s + s$ (+ oznacza konkatenację, czyli sklejanie stringów) oraz $s + c + s$ (gdzie $c$ to jakiś znak) są palindromamy $n+1$-krotnymi
Np. "abc" ma krotność 0, "kajak" ma krotność 1, "oko" ma krotność 2, "oooo" ma krotność 3, a "aabaacaabaa" ma krotność 4.

piątek, 23 sierpnia 2013

14783. Dobra i zła energia [AL_06_05]

Zadanie:
https://pl.spoj.com/problems/AL_06_05

Skrócony opis problemu:
Dla macierzy $n$x$n$ należy znaleźć największą sumę dowolnej podmacierzy.

Uwaga: Warto zapoznać się najpierw z wersją jednowymiarową opisaną tutaj. Będę na niej bazował. Problem dla wersji jednowymiarowej to znalezienie podłańcucha o największej sumie.

środa, 21 sierpnia 2013

15290. Wakacje [AL_08_06]

Zadanie:
https://pl.spoj.com/problems/AL_08_06

Skrócony opis problemu:
Dla danych liczb $x$, $n$ ($x \le 10^4, n \le 100$) oraz $n$-elementowej tablicy wybrać z tablicy takie liczby, aby ich suma była $\ge x$ i przy tym była minimalna. Jeśli jest wiele takich podzbiorów danej tablicy to znaleźć najmniej liczny.