読者です 読者をやめる 読者になる 読者になる

Tamflexの貯蔵庫

やる気のない備忘録

競技プログラミング 備忘録

競技プログラミングでつよい人のコードを見ると, 冒頭に大量のマクロや一行で記された関数の羅列を見かけることが多い.競プロにおいてはコード自体の保守性や拡張性よりも,アルゴリズムそのものに対する理解,およびその実装力が求められるので本質的なところに時間を割くためにもこのような簡略化の手法が多用されたりするのだ.実際便利なものも多いので, いつでも確認できるようにここによく使うものをにも載せておく.
なお個人的な好みの問題だけれども, 自分はマクロを大文字で表記するようにしている(関数との区別がしやすい).

・もっとマクロを使いたい場合...以下の文献が役に立ちそう.
競技プログラミング特有の変な実装テク // ichyo.jp
kyoupro_on_cpp.md · GitHub

for文関連

#define REP(i,n) for(int i=0;i<n;i++)
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define DOWN(i,b,a) for(int i=b;i>=a;i--)

REPはn回繰り返し, FORとDOWNは閉区間[a,b]の走査.個人的には閉区間で書くほうが好き.

定数

#define MAX 1000
#define SIZE 1000
#define INF 1 << 30
#define LLINF 1LL << 60

INFとLLINFはよく使う.

typedef関連

typedef long long ll;
typedef pair<ll,ll> Pll;
typedef pair<int, int> Pii;
typedef pair<double, double> Pdd;

llは有名.

関数

template<typename T> inline void priv(vector<T>a){REP(i,a.size()){cout<<a[i]<<((i==a.size()-1)?"\n":" ");}}
int gcd(int a,int b){int c=max(a,b);int d=min(a,b);return c==0||d==0?c:gcd(c%d,d);}
int lcm(int a,int b){return a==0||b==0?0:a*b/gcd(a,b);}

privはどこかから拝借いたしました.デバッグにも空白区切りで表示するときにも使える.

include

#include <bits/stdc++.h>

便利の一言に尽きる.

I/O関連

cin.tie(0);
ios::sync_with_stdio(false);

cin cout を高速で使いたいときに...でもバッファの処理を自分で書かなければならないので要注意.