C ++: Методы сокращения кода в соревновательном программировании

Опубликовано: 30 Декабря, 2021

Шорткод идеален в соревновательном программировании, потому что программы нужно писать как можно быстрее. Из-за этого конкурентоспособные программисты часто определяют более короткие имена для типов данных и других частей кода.
Здесь мы конкретно обсуждаем метод сокращения кода в C ++.
Имена типов
Используя команду typedef, можно дать более короткое имя типу данных.
Например, длинное длинное имя является длинным, поэтому мы можем определить более короткое имя ll:
typedef long long ll;
После этого код

CPP

long long a = 123456789;
long long b = 987654321;
cout << a * b << " " ;

можно замкнуть следующим образом:

CPP

ll a = 123456789;
ll b = 987654321;
cout << a * b << " " ;

Команда typedef также может использоваться с более сложными типами. Например, следующий код дает имя vi для вектора целых чисел и имя pi для пары, содержащей два целых числа,

CPP

typedef vector< int > vi;
typedef pair< int , int > pi;

Макросы
Другой способ сократить код - определить макросы . Макрос означает, что определенные строки в коде будут изменены перед компиляцией. В C ++ макросы определяются с помощью ключевого слова #define.
Например, мы можем определить следующие макросы:
#define F first
#define S second
#define PB push_back
#define MP make_pair
После этого код
v.push_back (make_pair (y1, x1));
v.push_back (make_pair (y2, x2));
int d = v [i] .first + v [i] .second;
можно закоротить следующим образом
v.PB (MP (y1, x1));
v.PB (MP (y2, x2));
int d = v [i] .F + v [i] .S;
Макрос также может иметь параметры, которые позволяют сокращать циклы и другие структуры. Например, мы можем определить следующий макрос:
# определить REP (i, a, b) for (int i = a; i <= b; i ++)
После этого код
for (int i = 1; i <= n; i ++) {
поиск (i);
}
можно сократить следующим образом:
REP (i, 1, n) {
поиск (i);
}
Версия шаблона приведена ниже
Это можно использовать в конкурентном программировании для более быстрого кодирования.

CPP

#include <bits/stdc++.h> // Include every standard library
using namespace std;
typedef long long LL;
typedef pair< int , int > pii;
typedef pair<LL, LL> pll;
typedef pair<string, string> pss;
typedef vector< int > vi;
typedef vector<vi> vvi;
typedef vector<pii> vii;
typedef vector<LL> vl;
typedef vector<vl> vvl;
double EPS = 1e-9;
int INF = 1000000005;
long long INFF = 1000000000000000005LL;
double PI = acos (-1);
int dirx[8] = { -1, 0, 0, 1, -1, -1, 1, 1 };
int diry[8] = { 0, 1, -1, 0, -1, 1, -1, 1 };
#ifdef TESTING
#define DEBUG fprintf(stderr, "====TESTING==== ")
#define VALUE(x) cerr << "The value of " << #x << " is " << x << endl
#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
#define DEBUG
#define VALUE(x)
#define debug(...)
#endif
#define FOR(a, b, c) for (int(a) = (b); (a) < (c); ++(a))
#define FORN(a, b, c) for (int(a) = (b); (a) <= (c); ++(a))
#define FORD(a, b, c) for (int(a) = (b); (a) >= (c); --(a))
#define FORSQ(a, b, c) for (int(a) = (b); (a) * (a) <= (c); ++(a))
#define FORC(a, b, c) for (char(a) = (b); (a) <= (c); ++(a))
#define FOREACH(a, b) for (auto&(a) : (b))
#define REP(i, n) FOR(i, 0, n)
#define REPN(i, n) FORN(i, 1, n)
#define MAX(a, b) a = max(a, b)
#define MIN(a, b) a = min(a, b)
#define SQR(x) ((LL)(x) * (x))
#define RESET(a, b) memset(a, b, sizeof(a))
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define ALL(v) v.begin(), v.end()
#define ALLA(arr, sz) arr, arr + sz
#define SIZE(v) (int)v.size()
#define SORT(v) sort(ALL(v))
#define REVERSE(v) reverse(ALL(v))
#define SORTA(arr, sz) sort(ALLA(arr, sz))
#define REVERSEA(arr, sz) reverse(ALLA(arr, sz))
#define PERMUTE next_permutation
#define TC(t) while (t--)
inline string IntToString(LL a)
{
char x[100];
sprintf (x, "%lld" , a);
string s = x;
return s;
}
inline LL StringToInt(string a)
{
char x[100];
LL res;
strcpy (x, a.c_str());
sscanf (x, "%lld" , &res);
return res;
}
inline string GetString( void )
{
char x[1000005];
scanf ( "%s" , x);
string s = x;
return s;
}
inline string uppercase(string s)
{
int n = SIZE(s);
REP(i, n)
if (s[i] >= 'a' && s[i] <= 'z' )
s[i] = s[i] - 'a' + 'A' ;
return s;
}
inline string lowercase(string s) в string lowercase(string s)
{
int n = SIZE(s);
REP(i, n)
if (s[i] >= 'A' && s[i] <= 'Z' )
s[i] = s[i] - 'A' + 'a' ;
return s;
}
inline void OPEN(string s)
{
#ifndef TESTING
freopen ((s + ".in" ).c_str(), "r" , stdin);
freopen ((s + ".out" ).c_str(), "w" , stdout);
#endif
}
// end of Sektor_jr template v2.0.3 (BETA)
int main()
{
freopen ( "A.in" , "r" , stdin);
freopen ( "output.txt" , "w" , stdout);
int a, b;
fin >> a >> b;
fout << a + b << endl;
return 0;
}

Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по доступной для студентов цене и будьте готовы к работе в отрасли. Получите все важные математические концепции для соревновательного программирования с курсом Essential Maths for CP по доступной для студентов цене.

Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.