logo

Писане на C/C++ код ефективно в състезателното програмиране

Преди всичко трябва да знаете за Шаблон Макроси и Вектори преди да преминете към следващата фаза! 

  • Шаблоните са в основата на общото програмиране, което включва писане на код по начин, който е независим от всеки конкретен тип.
  • Макросът е фрагмент от код, на който е дадено име. Всеки път, когато се използва името, то се заменя със съдържанието на макроса.
  • Векторите са същите като динамичните масиви с възможност за автоматично преоразмеряване, когато даден елемент бъде вмъкнат или изтрит, като тяхното съхранение се обработва автоматично от контейнера.


Така че можем да използваме тези мощни инструменти за написване на нашия код по ефективен начин.

    Използване на цикъл, базиран на диапазон: Това е много готина функция в C++11 и ще се счита за най-добра, ако искате да повторите от началото до края. Този код показва как да използвате цикли ranged for за итерация през масив и вектор: 
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; } 

Изход:



0 1 2 3 4 1 2 3 4 5
    Списък на инициализаторите:Този тип се използва за достъп до стойностите в списък за инициализация на C++. Тук обектите от този тип се конструират автоматично от компилатора от декларации на списък за инициализация, който е списък от елементи, разделени със запетая, затворени в скоби. 
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; } 

Изход: 

One Two Three
    Задаване на максимална или минимална стойност:Това е полезно за избягване на допълнителни усилия при писане на функция max() или 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; } 

Изход:

Max value = 11 Min value = -9
    Бърз вход/изход в C/C++:При състезателното програмиране трябва да четете Input/Output възможно най-бързо, за да спестите ценно време. 
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

За да научите повече за бързото въвеждане и извеждане Прочетете тази статия . 

дълго за нанизване
    Използване на макроси като for цикъл: Може би не би било добре да се използват такива макроси, тъй като това би намалило четливостта на кода, но за писане на бърз код можете да поемете този риск! 
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; } 

Изход  

4 5 6 9 22 11 5 6 9 22 11 11 22 9 6 5 4
    Използване на 'bits/stdc++.h':Вместо да добавяте тонове редове #include просто използвайте #include Файловете включват всички заглавни файлове, които ще ви трябват в състезателното програмиране, спестявайки много от вашето време.Контейнери:Използването на различни контейнери като карта на векторни списъци и т.н. позволява да се използват предварително дефинираните функции и значително намалява размера на кода (по-често, отколкото не)Бързо cin и cout:Ако използвате cin и cout за I/O, просто добавете следния ред точно след main(). 
std::ios_base::sync_with_stdio(false);
    авто:Използването на auto за деклариране на типове данни може да спести много време по време на състезания по програмиране. Когато дадена променлива е дефинирана като автоматичен компилатор, определя нейния тип по време на компилиране.Библиотеки и предварително дефинирани функции:Използване на вградени функции като __gcd(AB) swap _builtin_popcount(R) _builtin_clz(R) и т.н., където може да се приложи. Опитайте се да научите различни функции, налични в алгоритъм библиотека на C++. Те са полезни през повечето време в програмите


В крайна сметка с помощта на тези умни трикове можете лесно да пишете код за минимално време и думи.

Създаване на тест