Raab Game I
Pista 1
Primero, consideremos los empates. En un empate, nadie gana. Si es el número de partidas que se ganan, ¿cuántas partidas deben ser empates?
Pista 2
Después de manejar los empates, nos queda un subproblema donde el número total de cartas es . Como ambos jugadores tienen exactamente el mismo conjunto de cartas , la suma de los valores de sus cartas es igual. ¿Es posible que un jugador gane todas las rondas (es decir, marque ) si los conjuntos son idénticos?
Pista 3
Probemos un desplazamiento cíclico. Si el Jugador 1 juega las cartas en orden creciente , intentemos que el Jugador 2 juegue las cartas desplazadas por (módulo ). Por ejemplo, si , el Jugador 1 podría jugar , y el Jugador 2 jugará .
Solución
Explicación
Sea el número de cartas y y las puntuaciones objetivo.
Primero, manejamos los empates. El número de empates necesarios es . Si , el resultado es imposible porque las partidas jugadas deben sumar . En caso contrario, podemos satisfacer estos empates haciendo que ambos jugadores jueguen sus cartas más grandes una contra otra (p. ej., vs , vs , etc.).
Esto reduce el problema a construir una partida con las cartas donde y no hay empates.
Condición de existencia
Debemos determinar si existe una partida válida para las cartas restantes.
Como representa las partidas que no son empate, un jugador debe ganar cada ronda. Así, que el Jugador 1 tenga una puntuación de implica que ganó todas y cada una de las rondas. Esto requeriría que la carta del Jugador 1 sea estrictamente mayor que la del Jugador 2 en cada enfrentamiento.
Sin embargo, ambos jugadores poseen exactamente el mismo conjunto de cartas , así que la suma de sus cartas es igual. Si las cartas del Jugador 1 fueran estrictamente mayores en cada ronda, su suma total sería estrictamente mayor que la suma total del Jugador 2, lo cual es imposible.
Por lo tanto, si hay alguna partida que no sea empate (), ningún jugador puede terminar con una puntuación de 0. Si o , la respuesta es NO.
Construcción
Si las puntuaciones son válidas, podemos construir la partida usando un simple desplazamiento cíclico.
- El Jugador 1 simplemente juega todas sus cartas en orden creciente ().
- El Jugador 2 juega las cartas desplazadas por en las primeras rondas, y empareja al Jugador 1 en el resto.
Ejemplo: Sea (cartas que no son empate), y .
- El Jugador 1 juega:
- El Jugador 2 juega: (desplazado a la izquierda por )
Análisis de las primeras rondas:
- En las primeras rondas, el Jugador 1 juega y el Jugador 2 juega . Como , gana el Jugador 2 (). Esto le da al Jugador 2 exactamente puntos.
- En las rondas restantes, las cartas del Jugador 2 dan la vuelta a sus valores más pequeños (). El Jugador 1 juega los valores hasta . Como , las cartas del Jugador 1 son estrictamente mayores que las del Jugador 2. Esto le da al Jugador 1 exactamente puntos.
Implementación
Complejidad temporal:
#include <iostream>
using namespace std;
void solve() {
int n, a, b;
cin >> n >> a >> b;
int draws = n - (a + b);
// Imposible si necesitamos más empates que cartas disponibles
if (draws < 0) {
cout << "NO" << "\n";
return;
}
// Imposible si un jugador implica una victoria total sobre las cartas que no son empate
int k = n - draws;
if (k > 0 && (a == 0 || b == 0)) {
cout << "NO" << "\n";
return;
}
cout << "YES" << "\n";
// Jugador 1: juega 1..k (rondas de ganar/perder), luego k+1..n (empates)
for (int i = 1; i <= n; i++) { cout << i << " "; }
cout << "\n";
// Jugador 2: desplazamiento cíclico para las primeras k cartas
for (int i = 1; i <= k; i++) {
// Desplazamos por a y damos la vuelta
int val = i + a;
if (val > k) val -= k;
cout << val << " ";
}
// Jugador 2: empareja las cartas de empate exactamente
for (int i = k + 1; i <= n; i++) { cout << i << " "; }
cout << "\n";
}
int main() {
int t;
cin >> t;
while (t--) solve();
}