logo

Escribir código C/C++ de manera eficiente en programación competitiva

Primero que nada necesitas saber sobre Plantilla macros y Vectores ¡antes de pasar a la siguiente fase! 

  • Las plantillas son la base de la programación genérica que implica escribir código de una manera independiente de cualquier tipo en particular.
  • Una macro es un fragmento de código al que se le ha dado un nombre. Siempre que se utiliza el nombre, se reemplaza por el contenido de la macro.
  • Los vectores son iguales a las matrices dinámicas con la capacidad de cambiar su tamaño automáticamente cuando se inserta o elimina un elemento y el contenedor maneja automáticamente su almacenamiento.


Entonces podemos usar estas poderosas herramientas para escribir nuestro código de manera efectiva.
Algunos de los trucos interesantes que se pueden utilizar en la programación competitiva se detallan a continuación: 

    Usando rango basado en bucle: Esta es una característica muy interesante en C++ 11 y se consideraría mejor si desea iterar de principio a fin. Este código muestra cómo usar bucles for variados para iterar a través de una matriz y un vector: 
CPP
// C++ program to demonstrate range based for // loops for accessing vector and array elements #include   #include  using namespace std; int main() {  // Create a vector object that  // contains 5 elements  vector<int> vec = {0 1 2 3 4};  // Type inference by reference using auto.  // Range based loops are preferred when no  // modification is needed in value  for (const auto &value : vec)  cout << value << ' ';  cout << 'n';  // Basic 5 element integer array  int array[]= {1 2 3 4 5};  for (const auto &value: array)  cout << value << ' ';  return 0; } 

Producción:



0 1 2 3 4 1 2 3 4 5
    Lista de inicializadores:Este tipo se utiliza para acceder a los valores en una lista de inicialización de C++. Aquí, el compilador construye automáticamente los objetos de este tipo a partir de declaraciones de lista de inicialización, que es una lista de elementos separados por comas encerrados entre llaves. 
CPP
#include   template<typename T> void printList(std::initializer_list<T> text) {  for (const auto & value: text)  std::cout << value << ' '; } // Driver program int main() {  // Initialization list  printList( {'One' 'Two' 'Three'} );  return 0; } 

Producción: 

One Two Three
    Asignación de valor Máximo o Mínimo:Este es útil para evitar un esfuerzo adicional al escribir la función max() o min(). 
CPP
#include   // Call by reference is used in x template<typename T typename U> static inline void amin(T &x U y) {  if (y < x)  x = y; } // call by reference is used in x template<typename T typename U> static inline void amax(T &x U y) {  if (x < y)  x = y; } // Driver program to find the Maximum and Minimum value int main() {  int max_val = 0 min_val = 1e5;  int array[]= {4 -5 6 -9 2 11};  for (auto const &val: array)  // Same as max_val = max (max_val val)  // Same as min_val = min (min_valval)  amax(max_val val) amin (min_val val);  std::cout << 'Max value = ' << max_val << 'n'  << 'Min value = ' << min_val;  return 0; } 

Producción:

Max value = 11 Min value = -9
    Entrada/Salida rápida en C/C++:En la programación competitiva debes leer Entrada/Salida lo más rápido posible para ahorrar tiempo valioso. 
C
#include    template<typename T> void scan(T &x) {  x = 0;  bool neg = 0;  register T c = getchar();  if (c == '-')  neg = 1 c = getchar();  while ((c < 48) || (c > 57))  c = getchar();  for ( ; c < 48||c > 57 ; c = getchar());  for ( ; c > 47 && c < 58; c = getchar() )  x= (x << 3) + ( x << 1 ) + ( c & 15 );  if (neg) x *= -1; } template<typename T> void print(T n) {  bool neg = 0;  if (n < 0)  n *= -1 neg = 1;  char snum[65];  int i = 0;  do  {  snum[i++] = n % 10 + '0';  n /= 10;  }  while (n);  --i;  if (neg)  putchar('-');  while (i >= 0)  putchar(snum[i--]);  putchar('n'); } // Driver Program int main() {  int value;  // Taking input  scan(value);  // Printing output  print(value);  return 0; } 
Input: 756 Output: 756

Para saber más sobre entrada y salida rápidas Lee este artículo . 

    Usando macros como bucle for: Quizás no sería bueno usar este tipo de macros ya que reducirían la legibilidad del código, pero para escribir código rápido puedes correr ese riesgo. 
CPP
#include    using namespace std; #define rep(in) for (i = 0; i < n; ++i) #define REP(ikn) for (i = k; i <= n; ++i) #define REPR(ikn) for (i = k; i >= n; --i) // Driver program to test above Macros int main() {  int i;  int array[] = {4 5 6 9 22 11};  int size= sizeof(array)/sizeof(array[0]);    // Default 0 index based loop  rep(i size)   cout << array[i] << ' ';  cout<<'n';    // Starting index based loop  REP(i 1 size-1)   cout << array[i] << ' ';  cout<<'n';    // Reverse for loop  REPR(i size-10)   cout << array[i] << ' ';  return 0; } 

Producción  

4 5 6 9 22 11 5 6 9 22 11 11 22 9 6 5 4
    Usando 'bits/stdc++.h':En lugar de agregar toneladas de líneas #include, simplemente use #include Los archivos incluyen todos los archivos de encabezado que necesitará en la programación competitiva, lo que le ahorrará mucho tiempo.Contenedores:El uso de varios contenedores como mapas de listas vectoriales, etc., permite utilizar las funciones predefinidas y reduce considerablemente el tamaño del código (la mayoría de las veces)Rápido cin y cout:Si usa cin y cout para E/S, simplemente agregue la siguiente línea justo después de main(). 
std::ios_base::sync_with_stdio(false);
    auto:Usar auto para declarar tipos de datos puede ahorrar mucho tiempo durante los concursos de programación. Cuando una variable se define como compilador automático, determina su tipo durante el tiempo de compilación.Bibliotecas y funciones predefinidas:Usar funciones integradas como __gcd(AB) swap _builtin_popcount(R) _builtin_clz(R), etc., dondequiera que se pueda aplicar. Intente aprender las diferentes funciones disponibles en algoritmo biblioteca de C++. Son útiles la mayoría de las veces en programas


En última instancia, al utilizar estos trucos inteligentes, puede escribir código fácilmente en una cantidad mínima de tiempo y palabras.

Crear cuestionario