みちらからだよー

競プロとかその他しょうもない事とか

C++のテンプレートを作った話

//include std
#include <iostream> // cout, endl, cin
#include <string> // string, to_string, stoi
#include <vector> // vector
#include <algorithm> // min, max, swap, sort, reverse, lower_bound, upper_bound
#include <utility> // pair, make_pair
#include <tuple> // tuple, make_tuple
#include <cstdint> // int64_t, int*_t
#include <cstdio> // printf
#include <map> // map
#include <queue> // queue, priority_queue
#include <set> // set
#include <stack> // stack
#include <deque> // deque
#include <unordered_map> // unordered_map
#include <unordered_set> // unordered_set
#include <bitset> // bitset
#include <cctype> // isupper, islower, isdigit, toupper, tolower

using namespace std;

ここはincludeを大体全部のっけてます。Clangでやるときのために#include <bits/stdc++.h>はやっていません。

//コンパイラと浮動小数点高速化
//#pragma GCC optimize("Ofast")//危険かも
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//cin,endlの高速化
//インタラクティブのときは外す
struct Fast {Fast() {std::cin.tie(0); ios::sync_with_stdio(false);}} fast;
#define endl '\n'

ここはどういう意味かよくわかっていません。とりあえずendlは遅いので'\n'に置き換えているということはわかります。

//using
using ll=long long;
using vi=vector<int>;
using vl=vector<ll>;
using vvi=vector<vi>;
using vvl=vector<vl>;

vi、vviがめちゃくちゃ便利です。これもっと前に知りたかった... vector<vector> a(n,vector(n))vvi a(n,vi(n))と書くことができます。

//define
#define itn int//これすき
 
/*最終兵器
絶対使うな
#define int long long
 */

説明不要ですね。上の#define itn intがめちゃくちゃ好きです。確か強い人のテンプレートにありました。

//マクロ
#define reps(i, a, n) for (ll i = (a); i < (ll)(n); ++i)
#define rep(i, n) reps(i, 0, n)
#define rrep(i, n) reps(i, 1, n + 1)
#define per(i,n) for(ll i=n-1;i>=0;i--)
#define pper(i,n) for(ll i=n;i>=1;i--)
#define all(x) (x).begin(),(x).end()
#define perm(c) sort(all(c));for(bool c##p=1;c##p;c##p=next_permutation(all(c)))
#define sz(x) ((int)(x).size())
#define YesNo(bool) if(bool){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}
#define vout(vi) rep(i,sz(vi))cout<<vi.at(i)<<" \n"[i+1==n];

マクロです。pperとかあまり有効活用できる気がしませんがまあよいでしょう。あとvoutはデバッグに便利そうです。

全体のコード

//include std
#include <iostream> // cout, endl, cin
#include <string> // string, to_string, stoi
#include <vector> // vector
#include <algorithm> // min, max, swap, sort, reverse, lower_bound, upper_bound
#include <utility> // pair, make_pair
#include <tuple> // tuple, make_tuple
#include <cstdint> // int64_t, int*_t
#include <cstdio> // printf
#include <map> // map
#include <queue> // queue, priority_queue
#include <set> // set
#include <stack> // stack
#include <deque> // deque
#include <unordered_map> // unordered_map
#include <unordered_set> // unordered_set
#include <bitset> // bitset
#include <cctype> // isupper, islower, isdigit, toupper, tolower
 
using namespace std;
//コンパイラと浮動小数点高速化
//#pragma GCC optimize("Ofast")//危険かも
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//cin,endlの高速化
//インタラクティブのときは外す
struct Fast {Fast() {std::cin.tie(0); ios::sync_with_stdio(false);}} fast;
#define endl '\n'
//using
using ll=long long;
using vi=vector<int>;
using vl=vector<ll>;
using vvi=vector<vi>;
using vvl=vector<vl>;
//define
#define itn int//これすき
 
/*最終兵器
絶対使うな
#define int long long
 */
 
//マクロ
#define reps(i, a, n) for (ll i = (a); i < (ll)(n); ++i)
#define rep(i, n) reps(i, 0, n)
#define rrep(i, n) reps(i, 1, n + 1)
#define per(i,n) for(ll i=n-1;i>=0;i--)
#define pper(i,n) for(ll i=n;i>=1;i--)
#define all(x) (x).begin(),(x).end()
#define perm(c) sort(all(c));for(bool c##p=1;c##p;c##p=next_permutation(all(c)))
#define sz(x) ((int)(x).size())
#define YesNo(bool) if(bool){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}
#define vout(vi) rep(i,sz(vi))cout<<vi.at(i)<<" \n"[i+1==n];
#define vin(vi) rep(i,sz(vi))cin>>vi.at(i);