マイ競プロ用テンプレートの紹介
最近長めの梅雨が明けて, 日差しがきつくなりましたね...。
この記事では自分の競技プログラミングで使うテンプレートを紹介したいと思います。
実は記事を書いてる日のお昼に我ながら出来のいい「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マクロです! から間の整数にが更新されていきます。ポイントは「でもであってもよい」ということです!
今までも以下のような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)
しかし今回のマクロは, 条件演算子でとの大小を比較しており, の遷移が増加したり減少したりします。この特徴は幅広い場面で使えると思います! ぜひ皆さんもお使いください!
2. REP(i, n)
#define REP(i,n) for(int i=0;i<(n);++i)
他の方も多く使われているrepマクロです。「特定の処理を回繰り返したい」というときとかに使い, 利用頻度多めです。
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マクロ試してみてください!
ではでは......。