Universal Cup Judging System

Universal Cup

Límite de tiempo: 15.0 s Límite de memoria: 2048 MB Puntuación total: 100 Dificultad: [mostrar] Interactivo Comunicación Hackeable ✓
Estadísticas

Questo è un problema interattivo. Ricorda di svuotare il buffer di output (flush) dopo ogni stampa. Per svuotare il tuo output, puoi usare:

  • fflush(stdout) o cout.flush() in C/C++;
  • System.out.flush() in Java e Kotlin;
  • sys.stdout.flush() in Python.

problem_16334_77704ec8666e21115ab8bd1ebbcde701.png
Il concetto del gioco, illustrato da Nano Banana Pro.

Stai partecipando a un gioco strategico a turni noto come Revolver Roulette.

Il gioco inizia con un revolver caricato con esattamente $6$ proiettili. Ciascun proiettile è vero (live) oppure a salve (blank), in modo indipendente e con uguale probabilità. Entrambi i giocatori conoscono sempre il numero attuale di proiettili veri e a salve rimasti nel tamburo, ma l'ordine esatto è sconosciuto.

Ogni giocatore inizia con $5$ punti vita (HP) e $2$ oggetti. Se gli HP di un giocatore scendono a $0$ o meno, viene eliminato e l'altro giocatore vince. I giocatori eseguono azioni a turno.

Procedura del Turno

Durante il proprio turno, il giocatore attivo può eseguire un numero qualsiasi delle seguenti azioni:

  • Usare un oggetto qualsiasi.
  • Eseguire una qualsiasi azione di sparo.

Il turno termina solo quando un'azione di sparo fa passare il turno all'altro giocatore, oppure quando un giocatore viene eliminato.

Azioni di Sparo

Il giocatore attivo deve scegliere una delle seguenti azioni di sparo:

  • Fire at Opponent: Il giocatore attivo spara il prossimo proiettile contro l'altro giocatore. Se è vero, l'altro giocatore perde $1$ HP. Indipendentemente dal tipo di proiettile, il turno passa all'altro giocatore.
  • Fire at Self: Il giocatore attivo spara il prossimo proiettile contro sé stesso. Se è vero, il giocatore attivo perde $1$ HP e il turno passa all'altro giocatore. Altrimenti, se è a salve, il giocatore attivo mantiene il turno e continua a eseguire azioni.

Oggetti

Quando un oggetto viene utilizzato, viene consumato e il giocatore attivo mantiene il turno, indipendentemente dal tipo di oggetto. Gli oggetti sono visibili a entrambi i giocatori. Quando un giocatore ottiene un nuovo oggetto (incluso ciascuno degli oggetti iniziali), questo viene scelto in modo uniformemente casuale tra i quattro tipi seguenti:

  • Dummy: Spara il prossimo proiettile contro un manichino da allenamento. Questo consuma il proiettile e non è considerato un'azione di sparo.
  • Magnifier: Sbircia il prossimo proiettile per rivelare se è vero o a salve. Entrambi i giocatori apprendono il risultato.
  • Converter: Inverte il tipo del prossimo proiettile (vero $\leftrightarrow$ a salve). Entrambi i giocatori osservano i conteggi aggiornati di proiettili veri e a salve.
  • Cage: Ottiene un effetto monouso che impedisce la fine del turno alla successiva azione di sparo che normalmente lo farebbe terminare. Nello specifico:

    • Se il giocatore in seguito esegue Fire at Opponent (indipendentemente dal fatto che il proiettile sia vero o a salve), l'effetto si applica e il turno non termina.
    • Se il giocatore in seguito esegue Fire at Self e il proiettile è vero, l'effetto si applica e il turno non termina (il giocatore perde comunque $1$ HP, ma mantiene il turno).

    L'effetto viene consumato immediatamente dopo essere stato applicato una volta. È possibile usare al massimo un oggetto Cage per turno.

Ricarica (Reloading)

Quando il tamburo è vuoto, vengono immediatamente caricati $6$ nuovi proiettili (ciascuno indipendentemente vero o a salve con uguale probabilità). Entrambi i giocatori vengono informati dei nuovi conteggi di proiettili veri e a salve. Inoltre, ciascun giocatore viene rifornito fino a $2$ oggetti (un giocatore con $k$ oggetti riceve $(2 - k)$ nuovi oggetti, ciascuno scelto in modo indipendente e uniformemente casuale tra i quattro tipi sopra indicati).

Obiettivo

Sei il giocatore che effettua il primo turno e il tuo obiettivo è vincere la partita eliminando il tuo avversario.

Input

La prima riga contiene due interi $n$ e $w$, che indicano che devi vincere almeno $w$ partite su $n$ per ottenere il verdetto accettato. Ci sono solo tre test:

  • Test di esempio: $n = 1$ e $w = 0$. ($0\%$)
  • Test segreto 1: $n = 2\,000$ e $w = 1\,000$. ($50\%$)
  • Test segreto 2: $n = 20\,000$ e $w = 11\,000$. ($55\%$)

Si può dimostrare che, quando entrambi i giocatori giocano in modo ottimale, il giocatore che effettua il primo turno vince circa il $56.89\%$ delle partite.

Protocollo di Interazione

Inizio della Partita

La tua soluzione agisce come il giocatore che effettua il primo turno contro l'interattore. All'inizio di ogni partita, l'interattore stampa un intero $g$:

  • Se $g = 0$, tutte le partite nell'esecuzione corrente sono completate. La tua soluzione deve terminare immediatamente.
  • Altrimenti, $g$ è l'indice della partita corrente ($1 \le g \le n$).

Per motivi tecnici, la tua soluzione viene eseguita due volte su ciascun test:

  • L'interattore può decidere se riavviare la tua soluzione fornendo $g = 0$ in qualsiasi momento.

Riceverai gli stessi $n$ e $w$ per ciascuna esecuzione di un test. Pertanto, $n$ non è sempre uguale al numero di partite nell'esecuzione corrente. È garantito che ciascuna partita $1, \dots, n$ venga giocata esattamente una volta complessivamente nelle due esecuzioni. A parte questo, la tua soluzione può tranquillamente ignorare la condizione della doppia esecuzione.

Stato della Partita

Successivamente, l'interattore stampa la riga dello stato della partita contenente $13$ interi non negativi:

$$t \quad l \quad b \quad h_1 \quad d_1 \quad m_1 \quad c_1 \quad k_1 \quad h_2 \quad d_2 \quad m_2 \quad c_2 \quad k_2$$

  • $t \in \{0, 1, 2\}$: stato del turno.
  • $l, b$ ($1 \le l + b \le 6$): i conteggi attuali dei proiettili veri e a salve rimasti nel tamburo.
  • $h_1$ ($0 \le h_1 \le 5$): i tuoi HP attuali.
  • $d_1, m_1, c_1, k_1$ ($0 \le d_1 + m_1 + c_1 + k_1 \le 2$): il numero di oggetti Dummy, Magnifier, Converter e Cage che possiedi attualmente.
  • $h_2$ ($0 \le h_2 \le 5$): gli HP attuali del tuo avversario.
  • $d_2, m_2, c_2, k_2$ ($0 \le d_2 + m_2 + c_2 + k_2 \le 2$): il numero di oggetti Dummy, Magnifier, Converter e Cage posseduti dal tuo avversario.

Caso $t = 0$ (Partita Terminata)

La partita corrente è terminata. L'interattore passa alla partita successiva (stampando il nuovo $g$).

Caso $t = 1$ (Il Tuo Turno)

Devi stampare un intero per scegliere un'azione:

  1. Fire at Opponent.
  2. Fire at Self.
  3. Usare un oggetto Dummy.
  4. Usare un oggetto Magnifier.
  5. Usare un oggetto Converter.
  6. Usare un oggetto Cage.

Se l'azione non è valida (ad es. usare un oggetto che non hai o usare un oggetto Cage più di una volta nello stesso turno), lo stato della partita rimane invariato e l'interattore stampa $0$ e di nuovo la stessa riga di stato ($13$ interi). Anche se resta il tuo turno, devi compiere un'altra azione valida per proseguire con la partita.

Altrimenti, l'azione è efficace e l'interattore stampa un intero di risultato:

  • Per le azioni $1$–$5$: Restituisce $1$ se il prossimo proiettile prima dell'azione è vero, $2$ se è a salve.
  • Per l'azione $6$: Restituisce $1$ (nessuna informazione sul proiettile rivelata).

L'interattore stampa quindi la riga dello stato della partita aggiornata.

Caso $t = 2$ (Turno dell'Avversario)

L'interattore simula l'azione del tuo avversario e stampa due righe:

  • L'ID dell'azione $a \in \{1, \dots, 6\}$.
  • L'intero di risultato ($1$ o $2$ come descritto sopra).

Il tuo avversario non compie mai un'azione illegale. Subito dopo, l'interattore stampa la successiva riga dello stato della partita ($13$ interi).

Per ogni round della partita, il simulatore di gioco utilizza un generatore di numeri pseudocasuali con un seme (seed) casuale fisso. Inoltre, l'avversario nell'interattore adotta una strategia deterministica. La decisione di riavviare la tua soluzione è indipendente dalla procedura di interazione. Pertanto, la stessa sequenza di azioni porta sempre allo stesso stato di gioco.

È fornito uno strumento di test per aiutarti a sviluppare e testare la tua soluzione.

Esempio

Esempio 1, Passaggio 1

Input
1 0
1
1 3 3 5 0 0 0 2 5 1 0 1 0

1
1 3 3 5 0 0 0 1 5 1 0 1 0

1
1 2 3 5 0 0 0 1 4 1 0 1 0

0
1 2 3 5 0 0 0 1 4 1 0 1 0

2
1 2 2 5 0 0 0 1 4 1 0 1 0

1
2 1 2 5 0 0 0 1 3 1 0 1 0
5
2
2 2 1 5 0 0 0 1 3 1 0 0 0
1
1
1 1 1 4 0 0 0 1 3 1 0 0 0

1
2 0 1 4 0 0 0 1 2 1 0 0 0
3
2
2 2 4 4 0 1 0 1 2 0 1 0 1
2
1
1 1 4 4 0 1 0 1 1 0 1 0 1

1
1 1 4 4 0 0 0 1 1 0 1 0 1

1
0 0 4 4 0 0 0 1 0 0 1 0 1
0
Output


6


1


6


2


1








1








4


1

Esempio 1, Passaggio 2

Input
1 0
0
Output
		

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.