マイ競プロ用テンプレートの紹介

 最近長めの梅雨が明けて, 日差しがきつくなりましたね...。




 この記事では自分の競技プログラミングで使うテンプレートを紹介したいと思います。

 実は記事を書いてる日のお昼に我ながら出来のいい「forマクロ」を考案(たぶん既出)したので布教したいと思って書き始めました。


 まず下記がマイテンプレートです。

#include <bits/stdc++.h>
#define REP(i,n)   for(int i=0;i<(n);++i)
#define FOR(i,a,b) for(long long i=(a);((a)>(b)?i>=(b):i<=(b));((a)>(b)?--i:++i))
#define ALL(v)     (v).begin(),(v).end()
#define debug(x)   cerr<<#x<<": "<<(x)<<endl
#define INF        (int)1e9
#define EPS        (double)1e-9
#define MOD        ((int)1e9+7)
using namespace std;
typedef long long     llong;
typedef vector<int>   vi;
typedef vector<vi >   vvi;
typedef vector<vvi >  vvvi;
typedef pair<int,int> pii;
template<class Type>
void line(const Type &a){int cnt=0;for(const auto &elem:a){cerr<<(cnt++?' ':'>');cerr<<elem;}cerr<<endl;}

 ではいくつかお気に入りのやつを紹介していきます。


1. FOR(i, a, b)

#define FOR(i,a,b) for(long long i=(a);((a)>(b)?i>=(b):i<=(b));((a)>(b)?--i:++i))

 これがおニューのforマクロです!  aから b間の整数に iが更新されていきます。ポイントは「 a < bでも a > bであってもよい」ということです!

 今までも以下のようなforマクロを導入しようかと思ったのですが, 大した利便性がないと思って避けていました。

#define FOR(i,a,b)  for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for(int i=(a);i>=(b);--i)

 しかし今回のマクロは, 条件演算子 a bの大小を比較しており,  iの遷移が増加したり減少したりします。この特徴は幅広い場面で使えると思います! ぜひ皆さんもお使いください!


2. REP(i, n)

#define REP(i,n) for(int i=0;i<(n);++i)

 他の方も多く使われているrepマクロです。「特定の処理を n回繰り返したい」というときとかに使い, 利用頻度多めです。


3. ALL(v)

#define ALL(v) (v).begin(),(v).end()
vector<int> v={6,1,8,2,0};
//sort(v.begin(),v.end());	//長い...
sort(ALL(v));			//短くて良き...!

 これも多くの人が使われていますね。ソートとかするのに簡潔に書けるのでよく使います。


4. debug(x), line(a)

#define debug(x)   cerr<<#x<<": "<<(x)<<endl
template<class Type>
void line(const Type &a){int cnt=0;for(const auto &elem:a){cerr<<(cnt++?' ':'>');cerr<<elem;}cerr<<endl;}

 デバック用のマクロと関数です。line関数はvectorなどの中身を列挙します。標準エラー出力にすることでデバックを消し忘れたときにもWAしません!(AtCoderだけ?)


5. llong

typedef long long llong;

 (個人的な意見ですが, " ll "だとなんだか物足りないです...。)




 他にも説明していないものもありますが, 他の方のテンプレートにもあるので省略させてもらいます。ぜひ紹介したforマクロ試してみてください!

 ではでは......。