📜  C++:竞争性编程中的代码缩短方法

📅  最后修改于: 2021-05-25 21:47:40             🧑  作者: Mango

短代码是竞争性编程的理想选择,因为程序应尽可能快地编写。因此,有竞争力的程序员经常为数据类型和代码的其他部分定义较短的名称。
我们在这里专门讨论C++中的代码缩短方法。

类型名称
使用命令typedef可以给数据类型起一个简短的名字。
例如,名称long long很长,因此我们可以定义一个较短的名称ll:

typedef long long ll;

在此之后,代码

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

可以简称为:

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

命令typedef也可以用于更复杂的类型。例如,以下代码为整数矢量命名,名称为vi;对于包含两个整数的一对名称,命名为pi,

typedef vector vi;
typedef pair 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;

宏也可以具有参数,从而可以缩短循环和其他结构。例如,我们可以定义以下宏:

#define REP(i, a, b) for (int i=a; i<=b; i++)

在此之后,代码
for (int i=1; i<=n; i++){
search(i);
}

可以缩短为:
REP(i, 1, n){
search(i);
}

下面给出的模板版本
这可以用于竞争性编程中以实现更快的编码。

#include  // Include every standard library
using namespace std;
  
typedef long long LL;
typedef pair pii;
typedef pair pll;
typedef pair pss;
typedef vector vi;
typedef vector vvi;
typedef vector vii;
typedef vector vl;
typedef vector 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====\n")
#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)
{
    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;
}

如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。