Mistrzostwa Polski Szkół Średnich w Programowaniu Zespołowym 2024
Poprawnym dwunawiasowaniem nazwiemy każdy
ciąg złożony ze znaków ([)]
, który można otrzymać z
rekurencyjnej zależności:
- Ciąg pusty jest poprawnym dwunawiasowaniem
- Jeśli
P
jest poprawnym dwunawiasowaniem, to[P]
, oraz(P)
są poprawnymi dwunawiasowaniami - Jeśli
P
iQ
są poprawnymi dwunawiasowaniami, toPQ
jest poprawnym dwunawiasowaniem
Przykładowo, [()[]]
jest poprawnym dwunawiasowaniem, ale
[)(]
, lub [(])
nie są.
Napisz program, który wczyta ciąg nawiasów oraz zapytania o poprawność dwunawiasowania wybranych spójnych podsłów ciągu, wyznaczy dla każdego zapytania czy dwunawiasowanie jest poprawne i wypisze wyniki na standardowe wyjście.
Wejście
W pierwszym wierszu wejścia znajdują się jedna liczba N, oznaczająca długość ciągu.
W drugim wierszu wejścia znajduje się ciąg nawiasów o długości N.
W trzecim wierszu wejścia znajdują się jedna liczba Q, oznaczająca ilość zapytań.
W kolejnych Q wierszach znajduje się opis kolejnych zapytań, po jednym w
wierszu. Opis każdego zapytania składa się z dwóch liczb naturalnych
Li, Ri, oddzielonych
pojedynczym odstępem. Określają one zapytanie o poprawność zadanego
spójnego podciągu dwunawiasowania od Li-tego znaku do
Ri-tego
znaku włącznie.
Wyjście
Twój program powinien wypisać na wyjście dokładnie Q wierszy. W i-tym wierszu powinna się znaleźć
odpowiedź dla i-tego
zapytania. Odpowiedź dla każdego zapytania to jedno słowo
TAK
, jeśli dwunawiasowanie jest poprawne lub
NIE
w przeciwnym przypadku.
Ograniczenia
1 ≤ N, Q ≤ 1 000 000, 1 ≤ Li ≤ Ri ≤ N.
W testach wartych 30% wszystkich punktów zachodzi 1 ≤ N, Q ≤ 2 000.
W testach wartych 20% wszystkich punktów ciąg składa się tylko ze znaków
()
.
Przykład
Wejście | Wyjście | |
|
|
Wejście | Wyjście | |
|
|
To zadanie jest interaktywne.
W zadaniu będą obowiązywać następujące zasady gry w Jengę: Gra polega na naprzemiennym wyciągania klocków z wieży i budowaniu z nich kolejnych pięter. Każde piętro zbudowane jest z trzech podłużnych klocków o proporcji długości i szerokości 3:1 ułożonych w szeregu obok siebie w kierunku prostopadłym do kierunku klocków piętra poniżej. Gracz, po ruchu którego wieża się przewróci, przegrywa. Uznajemy, że wieża zawsze się przewraca, gdy na piętrze został tylko skrajny klocek, lub gdy zostanie podjęta próba wyjęcia środkowego klocka, gdy nie ma już innych klocków na piętrze. Wyciągnięte klocki są odkładane na najwyższe piętro, chyba że ma już ono trzy klocki, w tej sytuacji jest tworzone nowe piętro. Nie można wyciągać klocków nad którymi nie znajduje się żaden klocek. Rozgrywka nie musi się rozpoczynać z pełnej wieży, to znaczy, że na początku mogą występować piętra zawierające tylko dwa lub nawet jeden klocek (w przypadku jednego klocka może być to tylko środkowy).
Krzysztof i Igor ostatnio bez przerwy grają w Jengę. Wciągnęli się w nią tak bardzo, że opanowali tę grę do perfekcji. Jeżeli któryś z nich przegrywa, to tylko dlatego, że nie ma już ruchu, który nie przewróciłby wieży. Niestety Igor się rozchorował i teraz Krzysztof nie ma z kim grać, zaprosił więc Ciebie do wspólnej rozgrywki. Jako że Krzysztof wie, że nie masz takiego doświadczenia w tej grze jak on oraz Igor, postanowił, że da ci fory i pozwoli ci rozpocząć rozgrywkę z pozycji wygrywającej. Aby jeszcze mocniej zachęcić Ciebie do rozgrywki, Krzysztof pozwolił ci napisać program komputerowy, który będzie pomagał ci w rozgrywce. Możesz założyć, że już kiedyś grałeś w Jengę i też tak, jak Krzysztof i Igor potrafisz idealnie wyjmować klocki z wieży.
Twoim zadaniem jest więc napisanie programu, który poda ci ruchy pozwalające na wygranie z Krzysztofem.
Protokół interakcji
Na początku interakcji w pierwszym wierszu wejścia będzie znajdować
liczba naturalna N opisująca
liczbę pięter początkowej wieży. W następnych N wierszach pojawi się opis
początkowego stanu wieży. W i–tym wierszu będzie znajdował się
opis i–tego piętra Si składający
się ze trzech znaków #
oraz .
, oznaczających
odpowiednio klocek oraz pustą przestrzeń. Dla przykładu S3= ##.
oznacza, że trzecie piętro zawiera wszystkie klocki oprócz prawego.
Po wczytaniu wieży należy rozpocząć rozgrywkę. Ty wykonujesz ruch
jako pierwszy. Aby wyciągnąć j–ty klocek od lewej z i–tego piętra należy użyć zapytania
poprzez wypisanie dwóch liczb i j
. Po każdym zapytaniu
program sprawdzający wypisze na standardowe wejście dwie liczby
całkowite i oraz j, które oznaczają, że Krzysztof
wyciągnął j–ty klocek z i–tego piętra. W przypadku
zakończonej rozgrywki lub wykonania ruchu niezgodnego z zasadami,
program sprawdzający wypisze na wejście -1 -1
. Należy wtedy
natychmiast zakończyć działanie programu.
Należy pamiętać o opróżnianiu bufora wypisywania po każdym
zapytaniu. Aby to uczynić należy wykonać
cout.flush();
lub cout << endl
jeżeli
używamy cin/cout w C++, fflush(stdout)
dla printf/scanf w
C++, sys.stdout.flush()
w Pythonie oraz
System.out.flush()
w Javie.
Ograniczenia
2 ≤ N ≤ 50 000.
Podzadania
Podzadanie | Warunki | Punkty |
---|---|---|
1 | N ≤ 5 | 35 |
2 | N ≤ 5 000 | 25 |
3 | brak dodatkowych ograniczeń | 40 |
Przykładowa interakcja
Wejście | Wyjście | |
---|---|---|
2 |
||
### |
||
#.# |
||
1 1 |
||
1 3 |
||
2 2 |
||
-1 -1 |
Wyjaśnienie przykładu: Pomimo niestandardowego ułożenia klocków, po wyciągnięciu klocka z pierwszego piętra w pierwszym ruchu jest on odłożony na puste miejsce na drugim piętrze. Po wykonaniu drugiego ruchu stało się możliwe wyciąganie klocków z drugiego piętra.
Pamiętacie zadanie “Plakatowanie” z OI? Krzysztof jest w trakcie przygotowywania trudniejszej wersji tego zadania pod sparing. W zadaniu mamy dane N budynków stojących w szeregu jeden przy drugim, i–ty budynek jest reprezentowany przez prostokąt o szerokości Wi i wysokości Hi. Razem tworzą one długą ścianę, którą należy pokrywać plakatami. Plakaty są prostokątami, których boki są pionowe i poziome. Plakatów nie można ciąć, zginać, ani obracać; mogą one natomiast przybierać dowolne wymiary. Plakatowaniem nazwiemy całkowite pokrycie ściany plakatami, tak aby żaden plakat nie nachodził na siebie, ani nie wychodził poza obrys ściany. Należy szybko odpowiadać na zapytania o plakatowanie składające się z minimalnej liczby plakatów na segmencie ściany składającej się tylko i wyłącznie z budynków od Li–tego do Ri–tego.
Aby zadanie nie było za łatwe, Krzysztof postanowił w
niektórych testach wymusić odpowiadanie na zapytania w podanej
na wejściu kolejności, poprzez szyfrowanie zapytań. Zamiast liczb Li, Ri,
na wejściu będą podane liczby K, Ai, Bi.
Aby odzyskać wartości Li, Ri
należy użyć następujących wzorów:
Li = ((K⋅Ansi − 1)⊕Ai)
Ri = ((K⋅Ansi − 1)⊕Bi)
gdzie ⊕ oznacza operację XOR, a Ansi
odpowiedź na i–te zapytanie.
Uznajemy, że Ans0 = 0.
Pomóż Krzysztofowi z testowaniem poprzez napisanie rozwiązania do opisanego powyżej zadania.
Wejście
W pierwszym wierszu wejścia znajdują się trzy liczby naturalne N, Q, K opisujące odpowiednio liczbę budynków, liczbę zapytań oraz parametr służący do odszyfrowywania zapytań. W następnych N wierszach znajdują się opisy budynków, gdzie i–ty z nich zawiera liczby naturalne Wi, Hi oznaczające odpowiednio szerokość oraz wysokość i–tego budynku. W następnych Q wierszach znajdują się opisy zapytań, gdzie i–ty z nich zawiera liczby naturalne Ai, Bi, które po odszyfrowaniu oznaczają zapytanie na przedziale [Li,Ri].
Wyjście
Należy wypisać Q wierszy. W i–tym z nich ma się znaleźć odpowiedź na i–te zapytanie.
Ograniczenia
1 ≤ N, Q ≤ 500 000, 0 ≤ K ≤ 1, 1 ≤ Wi, Hi ≤ 109, 1 ≤ Li, Ri ≤ N, 1 ≤ Ai, Bi ≤ 2 ⋅ N.
Podzadania
Podzadanie | Warunki | Punkty |
---|---|---|
1 | N, Q ≤ 5 000 | 30 |
2 | N, Q ≤ 50 000, K = 0 | 20 |
3 | N, Q ≤ 50 000 | 10 |
4 | N, Q ≤ 500 000, K = 0 | 20 |
5 | brak dodatkowych ograniczeń | 20 |
Przykład
Wejście | Wyjście | |
|
|