Universal Cup Judging System

Universal Cup

Süre Sınırı: 3.0 s Bellek Sınırı: 1024 MB Toplam puan: 100 Etkileşimli
İstatistikler

Це інтерактивна задача.

Гра «Водопровідник Маріуш» (Plumber Mariusz) складається з $n + 1$ рівнів (пронумерованих від 0 до $n$), кожен із яких має $k$ версій (пронумерованих від 0 до $k - 1$). Кожна версія кожного рівня (крім останнього) закінчується двома трубами — лівою та правою — і Маріуш повинен стрибнути в одну з них. У кожній трубі міститься певна кількість монет, і вона веде до однієї з версій наступного рівня. До кожної версії кожного рівня (крім нульового рівня) ведуть рівно дві труби; це можуть бути будь-які дві з $2 \cdot k$ труб, що виходять з усіх $k$ версій попереднього рівня.

Одне проходження складається з вибору версії нульового рівня і подальшого вибору лівої або правої труби $n$ разів, а результатом проходження є загальна кількість монет, зібраних у $n$ відвіданих трубах. Ми не дізнаємося, скільки монет було в кожній окремій трубі та які версії рівнів було відвідано. Монети в трубах завжди скидаються до своїх початкових значень, тому всі проходження є незалежними. Отже, проходження можна представити функцією:

int rozgrywka(int ver, string s), де $\text{ver} \in [0, k - 1]$, а $s$ — рядок із $n$ літер L і P.

Зверніть увагу, що L і P відповідають польським словам, що означають лівий і правий відповідно.

Ви можете виконати до $300\,000$ тестових проходжень і дізнатися їхні результати. Після цього ви отримаєте до $10\,000$ запитів про проходження. Ваше завдання — визначити їхні результати.

Кожен тест фіксується до початку взаємодії (тобто інтерактор не є адаптивним). Тест містить орієнтований зважений граф із $(n + 1) \cdot k$ вершинами, розташованими в $n + 1$ шарах (рівнях), та $q$ запитів $(\text{ver}, s)$. Кожна вершина (крім вершин останнього шару) має два вихідні ребра (ліве і праве), кожне з яких описується кількістю монет $c \in [1, 10^8]$ та версією $v \in [0, k - 1]$, до якої воно веде. Нагадаємо, що півстепінь заходу кожної вершини, крім вершин нульового шару, дорівнює рівно 2.

Скидання буфера (Buffer flushing)

Після виведення кожного рядка ви повинні скидати буфер виведення (flush), щоб інтерактор отримав виведений рядок. Наприклад, у C++ ви можете вивести рядок зі знаком оклику за допомогою cout << "!" << endl; або printf("!\n"); fflush(stdout);. У Python можна використати print("!", flush=True). Ми не гарантуємо стабільну поведінку інтерактора, якщо ви виводите кілька рядків без скидання буфера після кожного з них або якщо ви виводите багато рядків, не зчитуючи відповіді інтерактора. Ваша програма не повинна відкривати жодних файлів.

Протокол взаємодії

Повний процес обміну даними описано нижче:

  • Зчитайте перший рядок, що містить два цілі числа $n$ і $k$ ($1 \le n, k \le 20$) — усього є $n + 1$ рівнів, кожен у $k$ версіях.
  • Щонайбільше $300\,000$ разів виконайте тестове проходження:
    • Виведіть рядок вигляду ? ver s (без лапок), де $\text{ver} \in [0, k - 1]$, а $s$ — рядок із $n$ літер L і P. Скиньте буфер.
    • Зчитайте наступний рядок, що містить результат проходження — ціле число $x$ ($n \le x \le n \cdot 10^8 \le 2 \cdot 10^9$).
  • Виведіть рядок, що містить один символ ! (знак оклику). Скиньте буфер.
  • Зчитайте наступний рядок, що містить ціле число $q$ ($1 \le q \le 10\,000$) — кількість запитів.
  • Для кожного з $q$ запитів:
    • Зчитайте наступний рядок, що містить ціле число $\text{ver}$ і рядок $s$ (обмеження ті самі, що й вище).
    • Виведіть рядок, що містить результат проходження (ціле число). Скиньте буфер.

problem_15450_dbed39bd9dd2139d827bc296b5b97e76.png

На ілюстрації показано перший тестовий приклад ($n = 2; k = 4$). Два фінальні запити позначено пунктирними лініями: rozgrywka(0, "LL") $= 20 + 3 = 23$ та rozgrywka(1, "PL") $= 9 + 10 = 19$.

Приклад

Нижче наведено приклад обміну даними:

Ваша програма Інтерактор Опис
2 4 3 рівні ($0 \dots 2$), кожен у 4 версіях ($0 \dots 3$).
? 0 LL
23 Перший пунктирний шлях на рисунку. Починаємо з версії 0 рівня 0, стрибаємо в ліву трубу (20 монет). Із версії 1 рівня 1 знову стрибаємо в ліву трубу (3 монети). Результат: $20 + 3 = 23$.
? 0 LL
23 Те саме проходження, той самий результат.
? 2 PL
610 $600 + 10 = 610$.
? 0 PP
9 $5 + 4 = 9$.
? 3 LP
7 $5 + 2 = 7$.
! Кінець тестових проходжень.
2 Потрібно відповісти на $q = 2$ запити.
0 LL Пощастило — ми протестували саме це проходження!
23
1 PL Ми не знаємо результату і не можемо його вивести. Ми жодного разу не тестували старт із версії 1 рівня 0.
19 Випадково вгадуємо правильний результат: $9 + 10 = 19$.

Примітка

У вкладенні (ви можете завантажити його у вкладці «attachment» на QOJ) знаходяться приклади (неправильних) розв'язків G.cpp та G.py, які коректно виконують обмін даними, але неправильно обчислюють результати. Каталог також містить: приклад перевіряючої програми Gsoc.cpp та приклади тестів (G0a.in, G0b.in, G0c.in, а також великий випадковий тест G0d.in із $n = k = 20$). Формат тестових файлів описано в коментарі на початку файлу Gsoc.cpp.

Приклад перевіряючої програми Gsoc.cpp відрізняється від тієї, що використовується на QOJ. Вона може не перевіряти коректність вхідних даних або аргументів функції проходження.

Ви можете запустити свій розв'язок за допомогою скрипту run.sh. Команда приймає скомпільовану програму та ім'я тестового файлу. Наприклад, щоб запустити приклади програм на тестовому прикладі G0a.in:

  • C++: g++ G.cpp -o G.e && ./run.sh "./G.e" G0a.in
  • Python: ./run.sh "python3 G.py" G0a.in

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.