はまやんはまやんはまやん

hamayanhamayan's blog

自分のテンプレについて

解説を見るうえで、テンプレが無いと理解できない部分を補うページ。
テンプレは必須ではないし、かの旅人はテンプレを持っていないので、ここら辺は好き好きという感じ。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rrep(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,a) for(auto &i:a)
#define all(x) (x).begin(),(x).end()
//#pragma GCC optimize ("-O3")
using namespace std;
void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); _main(); }
typedef long long ll; const int inf = INT_MAX / 2; const ll infl = 1LL << 60;
template<class T>bool chmax(T& a, const T& b) { if (a < b) { a = b; return 1; } return 0; }
template<class T>bool chmin(T& a, const T& b) { if (b < a) { a = b; return 1; } return 0; }

詳解

rep(i,a,b) for(int i=a;i<b;i++)

ループを短縮するマクロ。
rep(i,0,N)と書くとfor(int i=0;i < N;i++)となる。

rrep(i,a,b) for(int i=a;i>=b;i--)

逆順ループを短縮するマクロ。
rrep(i, N-1, 0)と書くとfor(int i=N-1;i >= 0;i--)

fore(i,a) for(auto &i:a)

foreachを短縮するマクロ。
fore(x, vec)と書くとfor(auto &x : vec)となる。
&がついているのでxを更新したら、そのまま元の配列も更新される。

all(x) (x).begin(),(x).end()

C++イテレータでよく使うbegin~endを短縮するマクロ。
よくsort(v.begin(), v.end());と書く場面があるが、これがsort(all(v));と書ける。

コメントアウトしてるけどpragma GCC optimize ("-O3")

計算時間ギリギリの時に最適化オプション付けたら間に合ったりする。
最適化オプションのせいで未定義動作とかで失敗する場合もあるので、
いつもはコメントアウトしてる。

using namespace std;

これはいつものやつ。
cinとかcoutとかはstd名前空間に属してる。

void main(); int main() { cin.tie(0); ios::sync_with_stdio(false); main(); }

いつも_main関数から始まっているが、実際のmain関数はコレ。
最近は問題になることがあるかは知らないけど、入力が遅いせいで間に合わないというのを避けるためのコードを入れている。

typedef long long ll; const int inf = INT_MAX / 2; const ll infl = 1LL << 60;

long longはllと書く人が多いので、それを真似ている。
int型の∞をinfとしている。INT_MAX/2をinfとしているのは、

  • inf+infをしてもオーバーフローしない
  • 109<infであり、大体のintでの上限は超えてくれる

という理由から。同じような理由でlong long型の∞をinflとしていて、1LL<<60としている。
1018は超えてくれるし、infl+inflはオーバーフローしない。

templatebool chmax(T& a, const T& b) { if (a < b) { a = b; return 1; } return 0; }

templatebool chmin(T& a, const T& b) { if (b < a) { a = b; return 1; } return 0; }

chmaxはchange max、chminはchange minの省略形。
chmax(x, y)はx=max(x,y)となっている。参照になっているので1番目の引数が更新される。
戻り値は代わりに「更新された場合にtrueが帰る」ようになっている。
if (chmin(minimum, total)) { min_idx = i; }
こんな感じに最小となるときのidxを取ってくるような場合に役立つ。

テンプレ?

/*---------------------------------------------------------------------------------------------------
            ∧_∧
      ∧_∧  (´<_` )  Welcome to My Coding Space!
     ( ´_ゝ`) /  ⌒i     @hamayanhamayan0
    /   \     | |
    /   / ̄ ̄ ̄ ̄/  |
  __(__ニつ/     _/ .| .|____
     \/____/ (u ⊃
---------------------------------------------------------------------------------------------------*/

このキャラを知らない場合は「流石兄弟」でググろう。
あと「かの旅人」とはtouristという世界最強の競プロerのことです。