狠狠撸

狠狠撸Share a Scribd company logo
競技プログラミングにおける
コードの書き方とその利便性
コーヤ?ロードアゲイン
#1day1problem の発足
● 主に1年生?2年生の競プロ力底上げ
● 初心者向けの典型问题とか投げてました
ある日の惭教授の忠告
そういえば开始当初は…
● 1年生が分かるようにC言語縛り
● 1年生が分かるようにマクロなし縛り
そういえば开始当初は…
しばらくして
● HARDはC++を使わせるつもりで選んだり
● 簡単なマクロ(minとかmaxとか)は使ったり
とはいえ
● 何人かはC++使えるっぽいし
● ぶっちゃけマクロ使いたいし
そんなわけで
● 競プロ特有のコード例
● その利便性 (大体「タイプ数が減る」)
を紹介します
/* 事前知識 */
オブジェクト形式マクロ
#define MAX 128
● コンパイル前の処理(プリプロセッサ)
● プログラム中のMAXが128に置換される
● MAXIMAとか描いても128IMAにはならない
int array[MAX]; // => int array[128];
int r = MAXIMA; // => int r = MAXIMA;
関数形式マクロ
#define SQR(x) x * x
● 関数っぽく置換される
● 本当にただ「置き換えるだけ」
int area = SQR(side); // => int area = side * side;
int x = SQR(a + b); // => int x = a + b * a + b;
関数形式マクロ
#define SQR(x) (x) * (x)
● 引数を()でくくると防げる
● 副作用があると相変わらず爆死
int x = SQR(a + b); // => int x = (a + b) * (a + b);
int y = SQR(++j); // => int x = (++j) * (++j);
インライン関数
inline int sqr(int x){ return (x * x * x); }
● 関数にinlineをつけるとインライン展開される
● 関数呼び出しのオーバーヘッドが0になる
● マクロと同様だが型安全、副作用にも比較的強い
● オプションをつけないとインライン展開されないことがある
int y = sqr(++j); // => 期待通りに動く
/* 本編 */
三項演算子
● 短いif-elseが削れる
● 行数も減って全体が見通しやすい
puts(is_uruu(y) ? “Yes” : “No”);
定数
const int INF = 100100100;
const int MOD = (int)1e9 + 7;
const double EPS = 1e-9;
● でかい数値で初期化する
● 剰余を求める問題
● 幾何の微調整用(EPSより小さいと0と判定、とか)
typedef
typedef long long ll;
● 型の別名をつける(主にlong longがllになる)
● 短い名前をつけてタイプ数を減らす
ll big_num;
FOR/REP
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define REP(i, n) for (int i = 0; i < (n); ++i)
● for文簡略化のためのマクロ
● インクリメントするときのミスが減る
for (int j = 0; j < n; ++i) // <- iではなくjが正解
REP(j, n) // => for (int j = 0; j < (n); ++j)
bits/stdc++.h
#include <bits/stdc++.h>
● ヘッダ全部盛り
● 惫别肠迟辞谤も补濒驳辞谤颈迟丑尘も蹿耻苍肠迟颈辞苍补濒も
短縮マクロ
#define fst first
#define pb push_back
● 短い
vector<int> v;
REP(i, n) v.pb(in());
ALL
#define ALL(obj) (obj).begin(), (obj).end()
● イテレータ簡略化のためのマクロ
● タイプ数が少ない
● コンテナじゃないと使えない
sort(ALL(v)); // => sort(v.begin(), v.end());
in
template <class T = int>
in(){ T x; cin >> x; return (x); }
● 宣言と同時に読み込みたい
● テンプレートなので色んな型に対応できる
● stdinより遅いので大量の入力には注意
int a = in(), b = in();
string s = in<string>();
print
template <class T>
print(T& x){ cout << x << ‘n’; }
● printfの書式書くのダルい
● わざわざ明示的に改行するのダルい
● stdoutより遅いので(ry
print(a / gcd(a, b) * b);
debug
#define debug(x) cerr << #x << “: “ << x << ‘n’
● #xでxを文字列にできる
● cerrに出すことで普通の出力と区別
● エラー出力を使うとダメなジャッジもあるので注意
double root2 = sqrt(2);
debug(root2) // => “root2: 1.41421”
cin/cout高速化
cin.tie(0);
sync_with_stdio(false);
● cinとcoutの結びつけを解除
● stdioとの同期をしない
● 入力と出力が非同期化される
● cinとstdin,coutとstdoutが混在するとバグる危険性がある
usingエイリアス
using template <class T> vec = vector<T>;
using ll = long long;
● usingでエイリアスが設定できる
● テンプレートが使えるtypedef
● C++11以降でないと使えない
vec<ll> v;
力が欲しいか…
#define int long long
● intでオーバーフローした時の切り替え用
● 強すぎる力にmain関数が耐えられない
● メモリ食い過ぎに注意(普通そんなに食わないけど)
int x; // => long long x;
int fact(int n) // => long long fact(long long n)
signed main
signed main()
● signedはintのこと
● main関数を保護することで強大な力を遺憾なく発揮できる
他にもいっぱい
● 紹介しきれないものたくさん
● くろこじのC++テンプレートのWiki
○ https://github.com/kurokoji/.cpp-Template/wiki
● 競プロ”圧倒的成長”
Thanks to kurokoji(https://github.com/kurokoji)

More Related Content

What's hot (20)

明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
京大 マイコンクラブ
?
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
HCPC: 北海道大学競技プログラミングサークル
?
目指せグラフマスター
目指せグラフマスター目指せグラフマスター
目指せグラフマスター
HCPC: 北海道大学競技プログラミングサークル
?
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba
?
最小カットを使って「燃やす埋める问题」を解く
最小カットを使って「燃やす埋める问题」を解く最小カットを使って「燃やす埋める问题」を解く
最小カットを使って「燃やす埋める问题」を解く
shindannin
?
AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説
AtCoder Inc.
?
动的计画法を极める!
动的计画法を极める!动的计画法を极める!
动的计画法を极める!
HCPC: 北海道大学競技プログラミングサークル
?
Nazoki
NazokiNazoki
Nazoki
Ken Ogura
?
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
HCPC: 北海道大学競技プログラミングサークル
?
双対性
双対性双対性
双対性
Yoichi Iwata
?
Rolling hash
Rolling hashRolling hash
Rolling hash
HCPC: 北海道大学競技プログラミングサークル
?
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
Nagisa Eto
?
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
理玖 川崎
?
指数时间アルゴリズムの最先端
指数时间アルゴリズムの最先端指数时间アルゴリズムの最先端
指数时间アルゴリズムの最先端
Yoichi Iwata
?
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説
AtCoder Inc.
?
RMQ クエリ処理
RMQ クエリ処理RMQ クエリ処理
RMQ クエリ処理
HCPC: 北海道大学競技プログラミングサークル
?
プログラミングコンテストでの动的计画法
プログラミングコンテストでの动的计画法プログラミングコンテストでの动的计画法
プログラミングコンテストでの动的计画法
Takuya Akiba
?
AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説
AtCoder Inc.
?
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
AtCoder Inc.
?
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba
?
最小カットを使って「燃やす埋める问题」を解く
最小カットを使って「燃やす埋める问题」を解く最小カットを使って「燃やす埋める问题」を解く
最小カットを使って「燃やす埋める问题」を解く
shindannin
?
AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説
AtCoder Inc.
?
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
Nagisa Eto
?
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
理玖 川崎
?
指数时间アルゴリズムの最先端
指数时间アルゴリズムの最先端指数时间アルゴリズムの最先端
指数时间アルゴリズムの最先端
Yoichi Iwata
?
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説
AtCoder Inc.
?
プログラミングコンテストでの动的计画法
プログラミングコンテストでの动的计画法プログラミングコンテストでの动的计画法
プログラミングコンテストでの动的计画法
Takuya Akiba
?
AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説
AtCoder Inc.
?
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
AtCoder Inc.
?

Similar to 竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性 (20)

Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macro
digitalghost
?
颁++勉强会颈苍広岛プレゼン资料
颁++勉强会颈苍広岛プレゼン资料颁++勉强会颈苍広岛プレゼン资料
颁++勉强会颈苍広岛プレゼン资料
真一 北原
?
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)
Shoji Haraguchi
?
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost
?
Chromeが落ちる問題を 追いかけていたら libgcryptのbugに出会った
Chromeが落ちる問題を 追いかけていたら libgcryptのbugに出会ったChromeが落ちる問題を 追いかけていたら libgcryptのbugに出会った
Chromeが落ちる問題を 追いかけていたら libgcryptのbugに出会った
Mitsutoshi Nakano
?
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
Noboru Irieda
?
C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介
yohhoy
?
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
?
组み込みでこそ颁++を使う10の理由
组み込みでこそ颁++を使う10の理由组み込みでこそ颁++を使う10の理由
组み込みでこそ颁++を使う10の理由
kikairoya
?
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)
ryos36
?
尝尝痴惭で游ぶ(整数圧缩とか、虫86向けの自动ベクトル化とか)
尝尝痴惭で游ぶ(整数圧缩とか、虫86向けの自动ベクトル化とか)尝尝痴惭で游ぶ(整数圧缩とか、虫86向けの自动ベクトル化とか)
尝尝痴惭で游ぶ(整数圧缩とか、虫86向けの自动ベクトル化とか)
Takeshi Yamamuro
?
颁++コミュニティーの中心で颁++を顿滨厂る
颁++コミュニティーの中心で颁++を顿滨厂る颁++コミュニティーの中心で颁++を顿滨厂る
颁++コミュニティーの中心で颁++を顿滨厂る
Hideyuki Tanaka
?
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127
Natsutani Minoru
?
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
?
笔测迟丑辞苍ではじめる竞技プログラミング
笔测迟丑辞苍ではじめる竞技プログラミング笔测迟丑辞苍ではじめる竞技プログラミング
笔测迟丑辞苍ではじめる竞技プログラミング
cocodrips
?
整数列圧缩
整数列圧缩整数列圧缩
整数列圧缩
JAVA DM
?
闇魔术を触ってみた
闇魔术を触ってみた闇魔术を触ってみた
闇魔术を触ってみた
Satoshi Sato
?
Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macro
digitalghost
?
颁++勉强会颈苍広岛プレゼン资料
颁++勉强会颈苍広岛プレゼン资料颁++勉强会颈苍広岛プレゼン资料
颁++勉强会颈苍広岛プレゼン资料
真一 北原
?
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)
Shoji Haraguchi
?
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost
?
Chromeが落ちる問題を 追いかけていたら libgcryptのbugに出会った
Chromeが落ちる問題を 追いかけていたら libgcryptのbugに出会ったChromeが落ちる問題を 追いかけていたら libgcryptのbugに出会った
Chromeが落ちる問題を 追いかけていたら libgcryptのbugに出会った
Mitsutoshi Nakano
?
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
Noboru Irieda
?
C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介
yohhoy
?
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
?
组み込みでこそ颁++を使う10の理由
组み込みでこそ颁++を使う10の理由组み込みでこそ颁++を使う10の理由
组み込みでこそ颁++を使う10の理由
kikairoya
?
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)
ryos36
?
尝尝痴惭で游ぶ(整数圧缩とか、虫86向けの自动ベクトル化とか)
尝尝痴惭で游ぶ(整数圧缩とか、虫86向けの自动ベクトル化とか)尝尝痴惭で游ぶ(整数圧缩とか、虫86向けの自动ベクトル化とか)
尝尝痴惭で游ぶ(整数圧缩とか、虫86向けの自动ベクトル化とか)
Takeshi Yamamuro
?
颁++コミュニティーの中心で颁++を顿滨厂る
颁++コミュニティーの中心で颁++を顿滨厂る颁++コミュニティーの中心で颁++を顿滨厂る
颁++コミュニティーの中心で颁++を顿滨厂る
Hideyuki Tanaka
?
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
?
笔测迟丑辞苍ではじめる竞技プログラミング
笔测迟丑辞苍ではじめる竞技プログラミング笔测迟丑辞苍ではじめる竞技プログラミング
笔测迟丑辞苍ではじめる竞技プログラミング
cocodrips
?
整数列圧缩
整数列圧缩整数列圧缩
整数列圧缩
JAVA DM
?
闇魔术を触ってみた
闇魔术を触ってみた闇魔术を触ってみた
闇魔术を触ってみた
Satoshi Sato
?

竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性