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  -1    0  )         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