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

środa, 12 listopada 2014

629. Skąpiec [MISER]

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

Skrócony opis problemu:
Dla danego zbioru $n$ punktów w przestrzeni 2-wymiarowej należy wyznaczyć dowolne 2 punkty, takie że okrąg utworzony na nich oraz na pierwszym punkcie z wejścia (nazwijmy go $A$) nie zawiera w sobie żadnego innego punktu (mogą jednak się znaleźć punkty na samym okręgu). Żadne 3 punkty nie są współliniowe.

20684. Czary Tadeusza [CZRTAD]

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

Skrócony opis problemu:
Dla danego ciągu liczb $a$ o długości $n$ wyznacz najmniejszą taką liczbę $x$, że z podanego ciągu można zrobić ciąg rosnący odejmując lub dodając do każdego wyrazu ciągu maksymalnie $x$.

poniedziałek, 3 listopada 2014

21030. Liczby podzielne przez 3 [FR_02_15]

Zadanie:
https://spoj.com/FRAKTAL/problems/FR_02_15
https://pl.spoj.com/problems/FR_02_15

Skrócony opis problemu:
Otrzymujemy liczby, w których niektóre cyfry zostały zastąpione znakami zapytania. Należy wypisać liczbę kombinacji jakie można uzyskać zamieniając znaki '?' na cyfry, aby otrzymać liczby podzielne przez 3.

piątek, 17 października 2014

4622. PTwPZ Paleta [PTWPZ096]

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

Skrócony opis problemu:
Mamy listę $n$ kolorów modelu RGB, czyli w postaci trójki liczb z przedziału $\left<0; 255\right>$. Mamy następnie $m$ zapytań będących również pojedynczymi kolorami RGB. Dla każdego koloru z zapytania należy znaleźć najbliższy mu kolor z listy, którą dostaliśmy na początku. Odległość jest w metryce euklidesowej (czyli $odl(col1, col2) = \sqrt{\left(col1.r-col2.r\right)^2 + \left(col1.g-col2.g\right)^2 +\left(col1.b-col2.b\right)^2}$). Jeśli 2 punkty będą w tej samej odległości, to należy wybrać ten z większą składową czerwoną. Jeśli i one będą równe - z większą składową zieloną i ew. z większą składową niebieską. Kolory rozłożone są równomiernie na obszarze, który zajmują (a nie np. tylko na zewnętrznych ścianach lub prawie tylko w centrum).

środa, 15 października 2014

573. Marsze na orientację [PZPI1]

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

Skrócony opis problemu:
Mamy $n$ punktów numerowanych od 1 do $n$ oraz $k$ ($k < n$) zapytań. Zapytanie składa się z dwóch liczb: $a$ i $b$. Dla każdego zapytania należy podać dowolną ścieżkę z punktu $a$ do punktu $b$ (przechodząc przez inne punktu po drodze lub nie), jednak żadne dwie trasy (będące odpowiedzią na zapytania) nie mogą mieć wspólnego fragmentu (bezpośredniego połączenia między tą samą parą punktów). Czyli po prostu musimy wypisywać dowolne ścieżki, ale bez wspólnych krawędzi. Jeżeli dla danego testu nie da się utworzyć ścieżek, które by spełniały kryteria z zadania, to należy wypisać NIE.

sobota, 4 października 2014

niedziela, 21 września 2014

19761. Trzyliterówka [FR_01_M5]

Zadanie:
https://spoj.com/FRAKTAL/problems/FR_01_M5
https://pl.spoj.com/problems/FR_01_M5

Skrócony opis problemu:
Dla $n$ 3-literowych słów złożonych z małych liter alfabetu łacińskiego (o długości ilości liter - $d$) sprawdź, czy da się połączyć wszystkie słowa w jedno. Słowo $A$ można połączyć ze słowem $B$, jeśli pierwsza litera słowa $A$ jest taka sama jak ostatnia litera słowa $B$ lub na odwrót. Np. "algoliga algorytm" da się połączyć w słowo algoligalgorytm.

środa, 17 września 2014

1144. Autobus [MWPZ06C]

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

Skrócony opis problemu:
Do $n$-osobowego autobusu wsiada $m$ osób. Jest 1 rząd miejsc siedzących. Pierwsza osoba siada na miejscu $x$. Kolejne osoby siadają wg następujących zasad:
  • kolejna osoba wybiera miejsce, którego odległość do najbliższego zajętego miejsca jest jak największa
  • jeżeli miejsc, na których może usiąść naukowiec (zgodnie z poprzednim punktem) jest więcej to wybiera on takie, które jest najbliżej wejścia (tj. z najmniejszym numerkiem)
  • naukowcy nie zwracają uwagi na fakt istnienia kierowcy w autobusie
Dla $y$ wybranych osób należy podać ich miejsca (numerowane od 1 do $n$).

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, 14 lipca 2014

czwartek, 10 lipca 2014

2379. Światełka Choinkowe [BIPART]

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

Skrócony opis problemu:
Dla danego grafu nieskierowanego bez pętli należy sprawdzić czy da się pokolorować jego wierzchołki 2 kolorami (a więc nadać każdemu wierzchołkowi 1 z 2 kolorów tak, by każde 2 sąsiednie wierzchołki miały inne kolory).

poniedziałek, 7 lipca 2014

865. Bombardier Jaś [PZPI06_2]

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

Skrócony opis problemu:
Obliczenie stałej prędkości obrotowej działa, które wykonuje m strzałów pod różnymi kątami. Kąty te mają wspólny mianownik n. Działo obraca się przeciwnie do ruchu wskazówek zegara. Żadne 2 strzały nie zostały oddane w tym samym kierunku.

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).

czwartek, 13 marca 2014

1078. Kreskowany rysunek [ETI07E2]

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

Skrócony opis problemu:
Dla wielokąta wyznaczonego przez ciąg n znaków [NSWE] oznaczających odpowiednio kierunki: północ, południe, zachód, wschód wyznaczyć ilość linii potrzebnych do jego zakreskowania liniami prostymi pod kątem $45\circ$. Wszystkie boki tego wielokąta są albo równoległe, albo prostopadłe do osi OX.