Contest problemset description


Sekwencjonowanie BNA
(A)
Limit pamięci: 256 MB
Limit czasu: 10.00 s

To zadanie jest interaktywne. Po wypisaniu każdego wiersza należy opróżnić bufor. W C++ możesz użyć cout << flush, w Java – System.out.flush(), w Python – sys.stdout.flush(). Pamiętaj o wypisaniu białego znaku podczas opróżniania bufora. Należy ściśle trzymać się protokołu opisanego w rozdziale Protokół interakcji – niewczytanie wiadomości wysłanej przez interaktor skutkuje werdyktem wrong answer.


Rozpoczęte zostały prace nad opracowaniem leku na bitozę – chorobę genetyczną prześladującą mieszkańców Bitocji od paru dobrych wieków. Ostatnio dokonano pewnego postępu w badaniach. Bitoccy naukowcy podejrzewają, że udało im się wyizolować segment BNA odpowiedzialny za wywoływanie choroby.

BNA (kwas bitrybonukleinowy) jest organicznym związkiem chemicznym, który koduje informację genetyczną. BNA może być opisane jako ciąg kodujących go kwasów bitowych: zerozyny (“0”) oraz jedyniny (“1”). Aktualnym problemem w kontynuowaniu badań jest poznanie ciągu kwasów bitowych segmentu BNA, który odpowiada za bitozę.

Bajtazar – jako osoba odpowiedzialna za nadzór nad badaniami – poprosił ciebie, znajomego bioinformatyka, o napisanie programu komputerowego, który odczyta sekwencję BNA kodującego bitozę. Aby ci to umożliwić, Bajtazar udostępnił ci technologię pozwalającą na przeprowadzenie testów stwierdzających, czy sekwencja syntetycznie wytworzonego BNA znajduje się jako spójny podciąg sekwencji BNA bitozy. Niestety, przeprowadzenie pojedynczego testu może trwać nawet parę godzin, dlatego zostałeś poproszony o to, aby twój program wykonał jak najmniej testów.

Interakcja

Na początku w pierwszym wierszu wejścia znajdzie się liczba całkowita N, oznaczająca długość sekwencji BNA bitozy.

Następnie należy przeprowadzić pewną (być może zerową) liczbę testów przy pomocy zapytań. Zapytania mają postać ? A, gdzie A jest ciągiem znaków 0 oraz 1 oznaczającym sekwencję syntetycznego BNA do zastosowania w teście. Odpowiedzią na zapytanie jest 1, jeśli sekwencja syntetycznego BNA znajduje się jako spójny podciąg w sekwencji BNA odpowiedzialnej za bitozę; w przeciwnym wypadku interaktor wypisze 0.

Po wykonaniu wszystkich zapytań, należy wypisać sekwencję BNA bitozy B w formacie: ! B.

Wypisanie sekwencji BNA bitozy nie wlicza się do liczby zapytań.

Interaktor jest adaptacyjny, oznacza to, że sekwencja BNA bitozy nie musi być ustalona z góry i może być dobierana na bieżąco w trakcie działania programu, o ile jej zmiana nie zaprzeczy wynikom wykonanych do tej pory zapytań.

Punktacja

We wszystkich testach zachodzi: 1 ≤ N ≤ 10 000.

Liczba punktów zależy od liczby zadanych zapytań.

Oznaczmy przez Q maksymalną liczbę zapytań zadanych przez program. Wówczas, liczba punktów zależy w następujący sposób od Q:

Próg Q Liczba punktów
30 000 10
20 000 20
15 000 40
11 000 60
10 200 70
10 035 85
10 025 90
10 015 100

Jeśli Q ≥ 30 000, to otrzymasz 0 punktów za to zadanie.

W przeciwnym wypadku, gdy Q ≤ 10 015, otrzymasz 100 punktów.

W pozostałych przypadkach, jeśli Q jest równe któremuś z powyższych progów w tabeli, otrzymasz przypisaną mu liczbę punktów.

W przeciwnym razie Q znajduje się pomiędzy dwoma progami i otrzymasz liczbę punktów wyznaczoną liniową interpolacją pomiędzy nimi, z zaokrągleniem w dół.

Przykładowa interakcja

Wejście Wyjście
4
? 0
1
? 00
0
? 1
1
? 11
0
? 0101
0
? 00000
0
! 1010

Powyższa interakcja została przeprowadzona poprawnie. W szczególności zapytanie o długości większej niż N jest dopuszczalne. W powyższej interakcji Q jest równe 6, a więc Q ≤ 10 015, co oznacza, że za powyższy test zostanie przydzielone 100 punktów.

Narzędzia do testowania lokalnego

Zostaną udostępnione testy przykładowe i program interaktor.cpp oraz przykładowe błędne rozwiązanie o poprawnym schemacie komunikacji wa.cpp. Żeby uruchomić rozwiązanie na teście, należy skompilować rozwiązanie i interaktorkę, a następnie użyć komendy:

[plik wykonywalny z interaktor.cpp] [test] [plik wykonywalny z rozwiązaniem]

Na przykład: ./interaktor 0 ./wa


Klocki
(B)
Limit pamięci: 256 MB
Limit czasu: 2.00 s

Bajtazar postanowił przygotować na wystawę artystyczną instalację złożoną z podświetlanych klocków.
Ustawił je w N stosów, ponumerowanych od 1 do N. Wysokość i-tego stosu oznaczymy przez Si.

Przykładowe ustawienie klocków dla N = 20

Komisja bezpieczeństwa festiwalu stwierdziła jednak, że instalacja może być niebezpieczna. Uznano, że dzieło jest bezpieczne tylko wtedy, gdy wysokości sąsiednich stosów nie różnią się o więcej niż H klocków, tzn. dla każdego 1 ≤ i < N zachodzi |Si − Si + 1| ≤ H.

Bajtazar nie chce usuwać swojej instalacji, ale może ją zmodyfikować. W jednej operacji może:

  • dodać jeden klocek na szczyt wybranego stosu,
  • usunąć jeden klocek z wierzchu wybranego stosu (o ile ten stos nie jest pusty).

Bajtazar chce wykonać jak najmniej operacji, aby jego instalacja stała się bezpieczna.
Twoim zadaniem jest obliczenie minimalnej liczby potrzebnych operacji.

Wejście

W pierwszym wierszu wejścia znajdują się dwie liczby całkowite N oraz H – odpowiednio liczba stosów oraz maksymalna dozwolona różnica wysokości sąsiednich stosów.

W drugim (i ostatnim) wierszu wejścia znajduje się N nieujemnych liczb całkowitych oddzielonych pojedynczymi spacjami – wysokości S1, S2, …, SN kolejnych stosów.

Wyjście

W pierwszym i jedynym wierszu wyjścia powinna znaleźć się pojedyncza liczba całkowita – minimalna liczba operacji, które musi wykonać Bajtazar, aby jego instalacja stała się bezpieczna.

Ograniczenia

1 ≤ N ≤ 200 000, 0 ≤ H ≤ 109, 0 ≤ Si ≤ 109 dla każdego 1 ≤ i ≤ N

Podzadania

Podzadanie Warunki Punkty
1 N ≤ 10, Si ≤ 4 3
2 N ≤ 14, H ≤ 1, Si ≤ 4 4
3 N ≤ 10, H ≤ 2 9
4 H = 0 5
5 N ≤ 500, Si ≤ 400 6
6 N ≤ 500, Si ≤ 5000 11
7 N ≤ 5 000, Si ≤ 5 000 11
8 N ≤ 5 000 22
9 brak dodatkowych ograniczeń 29

Przykład

Wejście Wyjście Wyjaśnienie
6 1
2 10 0 2 4 3
10

Bajtazar może zabrać 7 klocków z drugiego stosu, następnie dodać 2 klocki na trzeci stos, oraz 1 klocek na czwarty stos.

Wejście Wyjście
6 3
2 10 2 6 4 3
6
Wejście Wyjście
4 1
1 4 1 4
4
Wejście Wyjście
10 1
10 9 8 7 6 5 4 3 2 1
0
Wejście Wyjście
3 0
1 1 3
2

Urodzinowy XOR
(C)
Limit pamięci: 256 MB
Limit czasu: 2.50 s

Jasiu dostał na urodziny ciąg N liczb A1, A2, …, An i zastanawia się teraz, jak bardzo powinien się cieszyć z tego prezentu.

Postanowił, że swoją decyzję podejmie na podstawie wartości XOR wszystkich liczb postaci Ai + Aj dla 1 ≤ i ≤ j ≤ N.

Jak zazwyczaj, Jasiu nie poradził sobie samemu z tym zadaniem i poprosił Cię o pomoc w znalezieniu interesującej go wartości.

Wejście

W pierwszym wierszu wejścia znajduje się pojedyncza liczba całkowita N – długość ciągu Jasia.

W drugim (i ostatnim) wierszu wejścia znajduje się N liczb całkowitych oddzielonych pojedynczymi spacjami – ciąg A1, A2, …, An Jasia.

Wyjście

W pierwszym i jedynym wierszu wyjścia powinna znaleźć się pojedyncza liczba całkowita – wartość interesująca Jasia.

Ograniczenia

1 ≤ N ≤ 106, 1 ≤ Ai ≤ 5 ⋅ 108.

Podzadania

Podzadanie Warunki Punkty
1 N ≤ 4 000 7
2 Ai ≤ 4 000 11
3 Ai ≤ 106 21
4 N ≤ 105 38
5 brak dodatkowych ograniczeń 23

Przykład

Wejście Wyjście Wyjaśnienie
4
3 7 10 7
17

A1 + A1 = 3 + 3 = 6

A1 + A2 = 3 + 7 = 10

A1 + A3 = 3 + 10 = 13

A1 + A4 = 3 + 7 = 10

A2 + A2 = 7 + 7 = 14

A2 + A3 = 7 + 10 = 17

A2 + A4 = 7 + 7 = 14

A3 + A3 = 10 + 10 = 20

A3 + A4 = 10 + 7 = 17

A4 + A4 = 7 + 7 = 14

6 ⊕ 10 ⊕ 13 ⊕ 10 ⊕ 14 ⊕ 17 ⊕ 14 ⊕ 20 ⊕ 17 ⊕ 14 = 17

Wejście Wyjście
4
9 9 9 9
0
Wejście Wyjście
10
21 7 4 19 30 1 15 12 28 27
56