Universal Cup Judging System

Universal Cup

时间限制: 3.0 s 内存限制: 1024 MB 总分: 100 交互
统计

Ini adalah soal interaktif.

Permainan "Tukang Ledeng Mariusz" (Plumber Mariusz) terdiri dari $n + 1$ level (dinomori dari 0 hingga $n$), yang masing-masing memiliki $k$ versi (dinomori dari 0 hingga $k - 1$). Setiap versi dari setiap level (kecuali level terakhir) berakhir dengan dua pipa — kiri dan kanan — dan Mariusz harus melompat ke salah satunya. Setiap pipa berisi sejumlah koin dan mengarah ke salah satu versi dari level berikutnya. Tepat dua pipa mengarah ke setiap versi dari setiap level (kecuali level nol); kedua pipa ini bisa berupa dua pipa mana saja di antara $2 \cdot k$ pipa yang keluar dari semua $k$ versi pada level sebelumnya.

Satu kali permainan terdiri dari memilih sebuah versi dari level nol lalu memilih pipa kiri atau kanan sebanyak $n$ kali, dan hasil dari permainan tersebut adalah total banyaknya koin yang dikumpulkan di $n$ pipa yang dikunjungi. Kita tidak mengetahui berapa banyak koin di setiap pipa ataupun versi mana saja dari level-level tersebut yang dikunjungi. Koin-koin di dalam pipa selalu diatur ulang ke nilai awalnya, sehingga semua permainan bersifat independen. Oleh karena itu, sebuah permainan dapat direpresentasikan oleh fungsi:

int rozgrywka(int ver, string s), dengan $\text{ver} \in [0, k - 1]$ dan $s$ adalah sebuah string yang terdiri dari $n$ huruf L dan P.

Perhatikan bahwa L dan P masing-masing bersesuaian dengan kata bahasa Polandia untuk kiri dan kanan.

Anda dapat melakukan hingga $300\,000$ permainan uji coba dan mempelajari hasilnya. Setelah itu, Anda akan menerima hingga $10\,000$ kueri tentang permainan. Tugas Anda adalah menentukan hasil-hasilnya.

Setiap uji sudah ditetapkan sebelum interaksi dimulai (yaitu interaktor tidak adaptif). Sebuah uji berisi graf berarah berbobot dengan $(n + 1) \cdot k$ simpul yang disusun dalam $n + 1$ lapisan (level), serta $q$ kueri $(\text{ver}, s)$. Setiap simpul (kecuali yang berada di lapisan terakhir) memiliki dua sisi keluar (kiri dan kanan), masing-masing dijelaskan oleh jumlah koin $c \in [1, 10^8]$ dan versi tujuan $v \in [0, k - 1]$. Ingat bahwa setiap simpul kecuali yang berada di lapisan nol memiliki derajat masuk tepat 2.

Pengosongan buffer (Buffer flushing)

Setelah mengeluarkan setiap baris Anda harus melakukan flush pada buffer keluaran, agar interaktor menerima baris keluaran tersebut. Sebagai contoh, di C++ Anda dapat mengeluarkan baris berisi tanda seru menggunakan cout << "!" << endl; atau menggunakan printf("!\n"); fflush(stdout);. Di Python Anda dapat menggunakan print("!", flush=True). Kami tidak menjamin perilaku interaktor yang stabil jika Anda mengeluarkan beberapa baris tanpa melakukan flush setelah masing-masing baris, atau jika Anda mengeluarkan banyak baris tanpa membaca respons interaktor. Program Anda tidak boleh membuka berkas apa pun.

Protokol Interaksi

Alur komunikasi lengkapnya dijelaskan di bawah ini:

  • Baca baris pertama yang berisi dua bilangan bulat $n$ dan $k$ ($1 \le n, k \le 20$) — terdapat $n + 1$ level, masing-masing dengan $k$ versi.
  • Hingga $300\,000$ kali, lakukan permainan uji coba:
    • Keluarkan satu baris berbentuk ? ver s (tanpa tanda kutip), dengan $\text{ver} \in [0, k - 1]$ dan $s$ adalah string berisi $n$ huruf L dan P. Flush.
    • Baca baris berikutnya yang berisi hasil permainan — sebuah bilangan bulat $x$ ($n \le x \le n \cdot 10^8 \le 2 \cdot 10^9$).
  • Keluarkan satu baris yang berisi satu karakter ! (tanda seru). Flush.
  • Baca baris berikutnya yang berisi sebuah bilangan bulat $q$ ($1 \le q \le 10\,000$) — banyaknya kueri.
  • Untuk masing-masing dari $q$ kueri:
    • Baca baris berikutnya yang berisi sebuah bilangan bulat $\text{ver}$ dan sebuah string $s$ (batas yang sama seperti di atas).
    • Keluarkan satu baris yang berisi hasil permainan (sebuah bilangan bulat). Flush.

problem_15450_dbed39bd9dd2139d827bc296b5b97e76.png

Ilustrasi di atas menunjukkan uji sampel pertama ($n = 2; k = 4$). Dua kueri akhir ditandai menggunakan garis putus-putus: rozgrywka(0, "LL") $= 20 + 3 = 23$ dan rozgrywka(1, "PL") $= 9 + 10 = 19$.

Contoh

Berikut adalah contoh alur komunikasi:

Program Anda Interaktor Deskripsi
2 4 3 level ($0 \dots 2$), masing-masing dengan 4 versi ($0 \dots 3$).
? 0 LL
23 Jalur garis putus-putus pertama pada gambar. Mulai dari versi 0 pada level 0, lompat ke pipa kiri (20 koin). Dari versi 1 pada level 1 lompat lagi ke pipa kiri (3 koin). Hasil: $20 + 3 = 23$.
? 0 LL
23 Permainan yang sama, hasil yang sama.
? 2 PL
610 $600 + 10 = 610$.
? 0 PP
9 $5 + 4 = 9$.
? 3 LP
7 $5 + 2 = 7$.
! Akhir dari permainan uji coba.
2 Terdapat $q = 2$ kueri untuk dijawab.
0 LL Beruntung — kita sudah menguji permainan persis seperti ini!
23
1 PL Kita tidak mengetahui hasilnya dan tidak dapat menyimpulkannya. Kita tidak pernah menguji mulai dari versi 1 pada level 0.
19 Secara kebetulan, kita menebak hasil yang benar: $9 + 10 = 19$.

Catatan

Pada lampiran (Anda dapat mengunduhnya di tab "attachment" di QOJ) Anda akan menemukan solusi sampel (yang salah) G.cpp dan G.py yang melakukan komunikasi dengan benar, tetapi menghitung hasil dengan salah. Direktori tersebut juga mencakup: pemeriksa sampel Gsoc.cpp dan uji sampel (G0a.in, G0b.in, G0c.in, serta uji acak besar G0d.in dengan $n = k = 20$). Format berkas uji dijelaskan dalam komentar di bagian awal Gsoc.cpp.

Pemeriksa sampel Gsoc.cpp berbeda dengan yang digunakan di QOJ. Pemeriksa tersebut mungkin tidak memvalidasi masukan atau argumen dari fungsi permainan.

Anda dapat menjalankan solusi Anda menggunakan skrip run.sh. Perintah ini menerima program yang telah dikompilasi dan nama berkas uji. Sebagai contoh, untuk menjalankan program sampel pada uji sampel 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.