logo

Escrevendo código C/C++ com eficiência em programação competitiva

Primeiro de tudo você precisa saber sobre Modelo Macros e Vetores antes de passar para a próxima fase! 

  • Os modelos são a base da programação genérica que envolve escrever código de uma forma independente de qualquer tipo específico.
  • Uma macro é um fragmento de código ao qual foi dado um nome. Sempre que o nome é usado ele é substituído pelo conteúdo da macro.
  • Os vetores são iguais aos arrays dinâmicos, com a capacidade de se redimensionar automaticamente quando um elemento é inserido ou excluído, com seu armazenamento sendo tratado automaticamente pelo contêiner.


Portanto, podemos usar essas ferramentas poderosas para escrever nosso código de maneira eficaz.
Alguns dos truques interessantes que podem ser usados ​​na programação competitiva são apresentados a seguir: 

    Usando intervalo baseado em loop: Este é um recurso muito interessante em C++ 11 e seria considerado o melhor se você quiser iterar do início ao fim. Este código mostra como usar loops for variados para iterar por meio de um array e um vetor: 
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; } 

Saída:



0 1 2 3 4 1 2 3 4 5
    Lista de inicializadores:Este tipo é usado para acessar os valores em uma lista de inicialização C++. Aqui, os objetos deste tipo são construídos automaticamente pelo compilador a partir de declarações de lista de inicialização, que é uma lista de elementos separados por vírgula entre colchetes. 
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; } 

Saída: 

One Two Three
    Atribuindo valor máximo ou mínimo:Este é útil para evitar esforço extra ao escrever a função max() ou 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; } 

Saída:

Max value = 11 Min value = -9
    Entrada/saída rápida em C/C++:Na programação competitiva você deve ler a entrada/saída o mais rápido possível para economizar um tempo 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 mais sobre entrada e saída rápida Leia este artigo . 

    Usando macros como loop for: Talvez não fosse bom usar tais macros, pois reduziriam a legibilidade do código, mas para escrever código rápido você pode correr esse risco! 
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; } 

Saída  

4 5 6 9 22 11 5 6 9 22 11 11 22 9 6 5 4
    Usando 'bits/stdc++.h':Em vez de adicionar toneladas de linhas #include, basta usar #include Os arquivos incluem todos os arquivos de cabeçalho necessários na programação competitiva, economizando muito do seu tempo.Recipientes:O uso de vários contêineres, como mapa de lista de vetores, etc., permite usar funções predefinidas e reduz consideravelmente o tamanho do código (na maioria das vezes)Cin e cout rápidos:Se você usar cin e cout para E/S, basta adicionar a seguinte linha logo após main(). 
std::ios_base::sync_with_stdio(false);
    auto:Usar auto para declarar tipos de dados pode economizar muito tempo durante concursos de programação. Quando uma variável é definida como compilador automático determina seu tipo durante o tempo de compilação.Bibliotecas e funções predefinidas:Usando funções integradas, como __gcd(AB) swap _builtin_popcount(R) _builtin_clz(R) etc, onde quer que isso possa ser aplicado. Tente aprender as diferentes funções disponíveis em algoritmo biblioteca de C++. Eles são úteis na maioria das vezes em programas


Em última análise, usando esses truques inteligentes, você pode escrever código facilmente em um mínimo de tempo e palavras.

Criar questionário