SlideShare a Scribd company logo
1 of 29
Download to read offline
競技プログラミングにおける
コードの書き方とその利便性
コーヤ・ロードアゲイン
#1day1problem の発足
● 主に1年生・2年生の競プロ力底上げ
● 初心者向けの典型問題とか投げてました
ある日のM教授の忠告
そういえば開始当初は…
● 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>
● ヘッダ全部盛り
● vectorもalgorithmもfunctionalも
短縮マクロ
#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

プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~Takuya Akiba
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化yosupo
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話Nagisa Eto
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Inc.
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)AtCoder Inc.
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Inc.
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Inc.
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Inc.
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木理玖 川崎
 
AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Inc.
 
直前合宿 講義スライド
直前合宿 講義スライド直前合宿 講義スライド
直前合宿 講義スライドtozan gezan
 

What's hot (20)

プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
Rolling hash
Rolling hashRolling hash
Rolling hash
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
双対性
双対性双対性
双対性
 
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説
 
Abc009
Abc009Abc009
Abc009
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
 
AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説
 
直前合宿 講義スライド
直前合宿 講義スライド直前合宿 講義スライド
直前合宿 講義スライド
 

Similar to 競技プログラミングにおけるコードの書き方とその利便性

Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macrodigitalghost
 
C++勉強会in広島プレゼン資料
C++勉強会in広島プレゼン資料C++勉強会in広島プレゼン資料
C++勉強会in広島プレゼン資料真一 北原
 
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)Shoji Haraguchi
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章Tomonobu_Hirano
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案yushin_hirano
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らないdigitalghost
 
Chromeが落ちる問題を 追いかけていたら libgcryptのbugに出会った
Chromeが落ちる問題を 追いかけていたら libgcryptのbugに出会ったChromeが落ちる問題を 追いかけていたら libgcryptのbugに出会った
Chromeが落ちる問題を 追いかけていたら libgcryptのbugに出会ったMitsutoshi Nakano
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介yohhoy
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくばHirotaka Kawata
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)ryos36
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127Natsutani 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
 
Pythonではじめる競技プログラミング
Pythonではじめる競技プログラミングPythonではじめる競技プログラミング
Pythonではじめる競技プログラミングcocodrips
 
整数列圧縮
整数列圧縮整数列圧縮
整数列圧縮JAVA DM
 

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
 
C++勉強会in広島プレゼン資料
C++勉強会in広島プレゼン資料C++勉強会in広島プレゼン資料
C++勉強会in広島プレゼン資料
 
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
 
Chromeが落ちる問題を 追いかけていたら libgcryptのbugに出会った
Chromeが落ちる問題を 追いかけていたら libgcryptのbugに出会ったChromeが落ちる問題を 追いかけていたら libgcryptのbugに出会った
Chromeが落ちる問題を 追いかけていたら libgcryptのbugに出会った
 
boost - std - C#
boost - std - C#boost - std - C#
boost - std - C#
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
Bjarne dont speaking
Bjarne dont speakingBjarne dont speaking
Bjarne dont speaking
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127
 
最新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月)
 
Pythonではじめる競技プログラミング
Pythonではじめる競技プログラミングPythonではじめる競技プログラミング
Pythonではじめる競技プログラミング
 
整数列圧縮
整数列圧縮整数列圧縮
整数列圧縮
 

競技プログラミングにおけるコードの書き方とその利便性