SlideShare una empresa de Scribd logo
1 de 29
Descargar para leer sin conexión
競技プログラミングにおける
コードの書き方とその利便性
コーヤ・ロードアゲイン
#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)

Más contenido relacionado

La actualidad más candente

プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
Takuya Akiba
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
Takuya Akiba
 

La actualidad más candente (20)

AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
直交領域探索
直交領域探索直交領域探索
直交領域探索
 
arc047
arc047arc047
arc047
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
直前合宿 講義スライド
直前合宿 講義スライド直前合宿 講義スライド
直前合宿 講義スライド
 
Topological sort
Topological sortTopological sort
Topological sort
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
 
AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
 

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

Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macro
digitalghost
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
Tomonobu_Hirano
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
 
整数列圧縮
整数列圧縮整数列圧縮
整数列圧縮
JAVA DM
 

Similar a 競技プログラミングにおけるコードの書き方とその利便性 (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ではじめる競技プログラミング
 
整数列圧縮
整数列圧縮整数列圧縮
整数列圧縮
 

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