Manejo de Entrada y Salida
Optimiza tu código con Fast I/O y aprende los patrones comunes para leer datos en concursos.
Entrada y Salida en C++
En la programación competitiva, la velocidad con la que tu programa lee y escribe datos puede ser la diferencia entre un “Accepted” y un “Time Limit Exceeded” (TLE).
1. Fast I/O: El Truco de Velocidad
Por defecto, cin y cout de C++ están sincronizados con las funciones de C (scanf y printf). Esta sincronización es lenta.
Incluye estas líneas al inicio de tu main para acelerar drásticamente la lectura y escritura:
cpp ios_base::sync_with_stdio(false); cin.tie(NULL);
¿Por qué \n en lugar de endl?
endl no solo imprime un salto de línea, sino que también vacía el búfer (buffer flush), lo
cual es una operación muy costosa. Usa \n para ser mucho más rápido en problemas con mucha
salida.
2. Patrones Comunes de Entrada
Los problemas suelen entregar los datos de tres formas principales:
A. Número fijo de casos de prueba
El problema te dice cuántas veces debes ejecutar tu lógica.
int t;
cin >> t;
while (t--) {
solve(); // Tu función con la lógica
}B. Hasta el fin del archivo (EOF)
Útil cuando no sabes cuántos datos vienen. cin devuelve false cuando ya no hay nada que leer.
int n;
while (cin >> n) {
// Procesar n
}C. Centinela (ej. Terminar en 0)
El programa se detiene cuando lee un valor específico.
int n;
while (cin >> n && n != 0) {
// Procesar n
}3. cin vs getline
cin >> variable: Lee hasta encontrar un espacio, tab o salto de línea.getline(cin, string_variable): Lee una línea completa, incluyendo espacios.
Si usas cin >> seguido de getline, debes limpiar el salto de línea que queda en el búfer:
int n;
string s;
cin >> n;
cin.ignore(); // Limpia el '\n' sobrante
getline(cin, s);