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.

Optimización Estándar

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?

Importante

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.
Peligro: Mezclando cin y getline

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);