Zadanie: BOW Gra w kręgle polish BOI 0, dzień. Dostępna pamięć: 6 MB. 30.04.0 Bajtazar jest miłośnikiem gry w kręgle, a także statystyki. Swego czasu spisywał on wyniki gier w kręgle. Niestety, niektóre zapisy rozmazały się i w związku z tym są teraz nieczytelne. Bajtazar poprosił Cię o napisanie programu znajdującego liczbę rozgrywek zgodnych z jego notatkami. Reguły gry w kręgle Gra w kręgle składa się z n rund: n zwykłych rund i jednej rundy końcowej. W typowej grze n = 0. Na początku każdej rundy 0 kręgli ustawianych jest pionowo na końcu toru. W czasie rundy gracz wykonuje dwa rzuty (oprócz rundy końcowej, kiedy może mieć trzy rzuty), w których za pomocą kuli próbuje przewrócić jak najwięcej kręgli na końcu toru. Każda runda zapisywana jest w postaci dwóch znaków (trzech w przypadku rundy końcowej). Dla każdego rzutu gracz otrzymuje tyle punktów bazowych, ile przewrócił w tym rzucie kręgli. Liczba punktów bazowych w każdej rundzie jest sumą punktów bazowych ze wszystkich rzutów w tej rundzie. Jeśli graczowi uda się przewrócić wszystkie 0 kręgli w jednej zwykłej rundzie, to oprócz 0 punktów bazowych otrzymuje jeszcze punkty dodatkowe. Reguły przyznawania punktów dodatkowych w rundzie zwykłej: Przewrócenie wszystkich 0 kręgli w pierwszym rzucie rundy określane jest jako strike. Runda zostaje wtedy zakończona, a punkty dodatkowe przyznaje się na podstawie wyników następnych dwóch rzutów: liczba przyznanych punktów dodatkowych równa jest liczbie uzyskanych punktów bazowych w tych dwóch rzutach. Strike jest oznaczony jako x-. Przewrócenie wszystkich 0 kręgli w dwóch rzutach określane jest jako spare. Punkty dodatkowe przyznaje się wyniku następnego rzutu: liczba przyznanych punktów dodatkowych równa jest liczbie uzyskanych punktów bazowych w tym rzucie. Spare jest oznaczony jako A/, gdzie A jest cyfrą opisującą liczbę kręgli przewróconych w pierwszym rzucie tej rundy. Jeśli przewrócono 9 albo mniej kręgli po obu rzutach, gracz otrzymuje tylko punkty bazowe. Taki wynik oznaczony jest jako AB, gdzie A jest cyfrą opisującą liczbę kręgli przewróconych w pierwszym rzucie tej rundy, a B jest cyfrą opisującą liczbę kręgli przewróconych w drugim rzucie (A + B < 0). Punkty dodatkowe dodawane są do wyniku rundy, w której rzucono strike albo spare, a nie do wyniku późniejszych rund, w której dodatkowe punkty zostały rzeczywiście zdobyte. Reguły rozgrywania końcowej rundy: Gracz może rzucić dwukrotnie w tej rundzie. Jeśli przewróci 9 albo mniej kręgli w tych rzutach, runda dobiega końca. W przeciwnym przypadku (udało się rzucić strike albo spare), gracz otrzymuje trzeci rzut w tej rundzie. Za każdym razem gdy graczowi uda się przewrocić wszystkie kręgle w którymkolwiek z tych trzech strzałów, kręgle są ponownie ustawiane do pozycji początkowej przed następnym rzutem. Wynik ostatniej rundy jest łączną liczbą kręgli przewróconych w tych rzutach i wszystkie te punkty są uznawane za punkty bazowe. Jest siedem możliwości, w jakie ostatnia runda może być zapisana (A i B oznaczają jednocyfrowe liczby): v. 3 Gra w kręgle /3 April 8 May 3, 0
Oznaczenie Opis Punkty xxx potrójny strike 30 xxa podwójny strike i rzut przewracający A kręgli 0 + A xa/ strike i spare, w którym pierwszy rzut przewrócił A kręgli 0 xab strike i dwa rzuty, przewracające kolejno A i B kręgli (A + B < 0) 0 + A + B A/x spare przewracający A kręgli w pierwszym rzucie, a następnie strike 0 A/B spare przewracający A kręgli w pierwszym rzucie i ostatni rzut przewracający 0 + B B kręgli AB- dwa rzuty, przewracające kolejno A i B kręgli (A + B < 0) A + B Każda rozgrywka opisywana jest za pomocą ciągu n + znaków. Na końcu rozgrywki obliczana jest całkowita liczba zdobytych punktów w każdej z rund. Na przykład całkowita zdobytych liczba punktów opisanych ciągiem: 08x-7//x-x-344/0/x obliczana jest następująco: Wejście Runda Opis Punkty bazowe Punkty dodatkowe Punkty w rundzie Suma punktów 08 0 + 8 8 8 x- 0 7 + 3 0 8 3 7/ 7 + 3 40 4 / + 8 0 0 60 x- 0 0 + 8 6 x- 0 + 3 97 7 3 + 3 0 8 44 4 + 4 8 0 9 / + 9 0 0 0 Końcowa 0/x 0 + 0 + 0 0 40 Pierwszy wiersz danych wejściowych zawiera pojedynczą liczbę q ( q ) liczbę przypadków testowych. Następne 3q wierszy zawiera opis przypadków testowych. Każdy przypadek testowy opisany jest w trzech wierszach. Pierwszy wiersz opisu przypadku testowego zawiera pojedynczą liczbę n ( n 0) liczbę rund. Drugi wiersz zawiera ciąg n + znaków reprezentujących opis gry w notatkach Bajtazara. Rozmyte znaki są zastąpione symbolem?. Trzeci wiersz zawiera n liczb oddzielonych spacjami sumaryczną liczbę punktów po każdej rundzie. Liczby te są albo czytelne w całości, albo zupełnie zamazane. Nieczytelne wyniki zastąpione są wartością -. Wyjście Twój program powinien wypisać q wierszy po jednym wierszu na przypadek testowy, odpowiednio do kolejności ich występowania na wejściu. Dla każdego przypadku testowego Twój program powinien wypisać jedną wartość całkowitą liczbę różnych możliwych rozgrywek odpowiadającym opisowi rozgrywki z wejścia. Dwie gry są uznawane za różne wtedy i tylko wtedy, gdy różnią się przynajmniej jednym rzutem, tzn. zapisy ich rozgrywek różnią się na przynajmniej jednej z n + pozycji. Możesz przyjąć, że dla każdego opisu rozgrywki z wejścia istnieje przynajmniej jedna rozgrywka zgodna z zasadami gry, której wyniki są zgodne z notatkami Bajtazara. Możesz przyjąć, że wynik mieści się w 64-bitowej liczbie całkowitej ze znakiem. v. 3 Gra w kręgle /3 April 8 May 3, 0
Przykłady 0 08x-7//x?x-3??/??? 8-40 60 8 97 0 0 0 40 x-x-3?/00-37 4 9 0 Wyjaśnienie do przykładu: W rundzie pierwszego przypadku testowego po znaku x jedynym możliwym znakiem jest -. W rundzie 8 gracz zdobył łącznie 8 punktów, zatem jest dokładnie 9 możliwości jak taka wartość mogła zostać otrzymana: 0 + 8, + 7,..., 8 + 0. W rundzie 9 nie zostały przyznane żadne punkty dodatkowe, zatem w pierwszym rzucie rundy końcowej gracz nie zdobył żadnych punktów. Żeby zdobyć 0 punktów w ostatnich dwóch rzutach, jedyną możliwością był spare, po którym nastąpił strike jako ostatni rzut rundy końcowej. Zatem jest dokładnie 9 różnych gier zgodnych z wejściowym ciągiem notatek. W drugim przypadku testowym każdy znak od 0 do 9 jest zgodny z notatkami Bajtazara. Dodatkowe testy przykładowe: W systemie zawodów znajdują się dodatkowe testy zawierające liczne przypadki testowe, w których zachodzi n =. Ocenianie Podzadanie Ograniczenia (w każdym przypadku testowym) Punkty maksymalnie 6 znaków? w ciągu wejściowym 6 wynik nie przekracza 0 9 7 3 żadna gra, której opis zawiera symbol x lub / nie jest zgodna z notatkami Bajtazara 6 4 ciąg wejściowy kończy się 00- (gracz zdobył 0 punktów w rundzie końcowej) 3 oraz wyniki ostatnich min(3, n) rund są zapisane jako - brak dodatkowych ograniczeń na dane wejściowe 8 v. 3 Gra w kręgle 3/3 April 8 May 3, 0
Zadanie: EDI Edytor polish BOI 0, dzień. Dostępna pamięć: MB. 30.04.0 Bajtazar jest programistą pracującym nad nowym, rewolucyjnym edytorem tekstu. W jego edytorze będą dostępne dwa rodzaje operacji: pierwszy to zwykła edycja tekstu, zaś drugi cofnięcie jednej z poprzednich operacji. Nowym pomysłem Bajtazara jest wprowadzenie operacji wielopoziomowego cofania, które działa w następujący sposób: Edycja tekstu to operacja poziomu 0. Operacja cofnięcia poziomu i polega na znalezieniu oraz cofnięciu ostatnio wykonanej, nie wycofanej operacji o poziomie i albo niższym. W szczególności, cofnięcie poziomu wycofuje ostatnią operację edycji tekstu, zaś cofnięcie poziomu może cofnąć zarówno edycje, jak i cofnięcia poziomu (ale nie cofnięcia wyższych poziomów). Bardziej formalnie: każda z już wykonanych operacji może być w jednym z dwóch stanów: aktywna, albo wycofana. Niech X będzie jedną z operacji. Zaraz po jej wykonaniu, jest aktywna. Jeśli X jest operacją cofnięcia poziomu i, znajdujemy ostatnią operację aktywną poziomu co najwyżej i (oznaczmy ją X ) i zmieniamy jej stan na wycofaną. Jeśli X sama była operacją cofnięcia i spowodowała wycofanie innej operacji X, musimy wtedy przywrócić X do stanu aktywnego. Dalej postępujemy według tej samej reguły jeśli operacja X j jest operacją cofnięcia i wpłynęła na stan jednej z poprzednich operacji X j+, zmieniamy również stan operacji X j+, oczywiście uwzględniając dalsze skutki tego faktu. Cały ten ciąg czynności kończy się, kiedy osiągniemy operację edycji tekstu. Dla uproszczenia, całą zawartość tekstu w edytorze będziemy reprezentować przez jedną liczbę całkowitą s, zwaną stanem edytora, na początku równą 0. Dla każdej operacji edycji znany jest stan, do którego doprowadza ona edytor. Stan edytora zależy wyłącznie od ostatniej operacji edycji będącej w stanie aktywnym. Pomóż Bajtazarowi i napisz program, który śledzi stan edytora. Przeanalizujmy następujący przykład. Poniższa tabela zawiera kilka operacji przeprowadzonych przez Bajtazara oraz stan edytora po każdej z nich. Symbol E s oznacza operację edycji tekstu zmieniającą stan edytora na s, zaś U i to operacja cofnięcia poziomu i. Operacja E E E U U U 3 E 4 U U U E Stan edytora 0 4 0 Na początku Bajtazar wykonał trzy operacje edycji, zmieniające stan edytora najpierw z 0 na, potem na, w końcu na. Potem wykonał dwie operacje cofnięcia poziomu pierwsza cofnęła operację E, zaś druga cofnęła E zmieniając ich stan na wycofane. W ten sposób stan edytora powrócił do. Kolejną operacją było cofnięcie poziomu 3, które wpłynęło na operację U (przez co stała się wycofana), tym samym przywracając operację E (czyniąc ją na powrót aktywną). Stan edytora przez to znowu zmienił się na. Operacja U cofnęła operację E 4, operacja U cofnęła (wcześniej przywróconą) operację E, przedostatnia operacja (U ) cofnęła operację E, zaś ostatnia operacja to E, ustalająca stan edytora na. Wejście Pierwszy wiersz wejścia zawiera liczbę całkowitą dodatnią n, będącą liczbą operacji wykonanych przez Bajtazara. Kolejnych n wierszy zawiera opisy operacji, po jednym w każdej linii. Opis składa się z pojedynczej liczby całkowitej a i ( n a i n, a i 0). Jeśli a i > 0, to operacja ta jest edycją tekstu, która zmienia stan edytora na a i. Jeśli a i < 0, to jest to operacja cofnięcia poziomu a i. Możesz założyć, że dla każdej operacji cofnięcia będzie istniała wcześniejsza operacja niższego poziomu w stanie aktywnym, która będzie mogła zostać cofnięta. v. 3 Edytor / April 8 May 3, 0
Wyjście Twój program powinien wypisać n wierszy. i-ty wiersz wyjścia powinien zawierać jedną liczbę całkowitą stan edytora po wykonaniu pierwszych i operacji podanych na wejściu. Przykłady - - -3 4 - - - 4 0 Ocenianie Podzadanie Ograniczenia Punkty n 000 0 n 300 000, jedynie operacje E i oraz U 3 n 300 000, oceniana jest wyłącznie ostatnia wypisana liczba (uwaga: pozostałe 8 n liczb wciąż muszą się zawierać między 0 a n) 4 n 300 000 37 v. 3 Edytor / April 8 May 3, 0
Zadanie: NET Sieć polish BOI 0, dzień. Dostępna pamięć: 6 MB. 30.04.0 Władze Bajtocji zdecydowały, że nadszedł najwyższy czas, aby ich mały kraj został podłączony do Internetu, dzięki czemu Bajtocjanie będą mogli wreszcie startować w zawodach programistycznych oraz oglądać filmiki ze słodkimi kotkami. Najpierw została zbudowana sieć szkieletowa, łącząca wszystkie n komputerów w Bajtocji. Sieć ta składa się z bezpośrednich połączeń między dwoma komputerami, wybranymi tak, aby między każdą parą bajtockich komputerów istniała bezpośrednia lub pośrednia komunikacja. Jako że Bajtocja nie jest zbyt bogatym krajem, sieć została zbudowana oszczędnie, w strukturze drzewa (tzn. istnieje dokładnie n bezpośrednich połączeń pomiędzy komputerami). Później okazało się, że takie rozwiązanie ma zasadniczą wadę wystarczy, aby zepsuło się chociaż jedno połączenie, a sieć Bajtocji rozpadnie się na części, które nie będą mogły się ze sobą komunikować. Aby poprawić niezawodność sieci, podjęto decyzję o rozbudowaniu jej tak, aby była odporna na zepsucie się jednego połączenia. Twoje zadanie jest następujące: mając daną listę bezpośrednich połączeń między komputerami (których jest n ), znajdź minimalną liczbę nowych połączeń, które trzeba stworzyć, aby zerwanie jednego połączenia nie przerwało komunikacji między żadną parą komputerów. Wejście Pierwszy wiersz wejścia zawiera liczbę całkowitą dodatnią n (n 3) liczbę komputerów w Bajtocji. Dla uproszczenia, numerujemy komputery kolejnymi liczbami całkowitymi od do n. Każdy z n następnych wierszy zawiera dwie liczby całkowite a i b ( a, b n, a b) opisujące bezpośrednie połączenie między komputerami o numerach a i b. Wyjście W pierwszym wierszu wyjścia Twój program powinien wypisać liczbę całkowitą k minimalną liczbę połączeń, które trzeba dodać do sieci. W kolejnych k wierszach powinny znaleźć się po dwie liczby całkowite a, b ( a, b n, a b) oznaczające numery komputerów, które należy połączyć. Połączenia mogą zostać wypisane w dowolnej kolejności. Jeśli jest więcej niż jedno rozwiązanie, Twój program może wypisać dowolne z nich. v. 3 Sieć / April 8 May 3, 0
Przykłady 6 3 4 4 6 4 3 4 6 3 6 8 3 3 4 4 3 6 3 7 3 8 6 7 3 4 8 3 6 7 8 4 Ocenianie Podzadanie Ograniczenia Punkty n 0 8 n 000 4 3 n 00 000 37 v. 3 Sieć / April 8 May 3, 0