AtCoderに必要な知識

社会人になって3年ぶりくらいにAtCoderをやってみて勉強しなおした知識まとめ。

3年前は水色だったけど、3年ぶりにABCに出たらパフォーマンス600くらいで泣いた。

新しいことを勉強したら、随時更新する。

水色に戻るまで

座標圧縮

数列の大小が必要だが差の大きさが必要ないとき使える。

数列Aを座標圧縮したいときは、数列Aを数列Bにコピーして、Bをソートして、mapを使って{num: index}みたいにして、数列Aの数字をindexに置換すれば良い。

参考記事: 座標圧縮 (座圧) – けんちょんの競プロ精進記録

Mod

数字が大きくなりすぎないように使う。四則演算と累乗はすぐにできるようにしておく必要がある。

参考記事

ビット演算

2進数で全探索をするときなど。

ビット演算 (bit 演算) の使い方を総特集! 〜 マスクビットから bit DP まで 〜 – Qiita

二次元累積和

一次元の累積和がわかっていれば二次元も直感的だった。

問題を解くときの発想になかったので覚えておくと便利。

参考: 累積和を何も考えずに書けるようにする! – Qiita

c++

vectorの参照渡し

関数にvectorを渡すとき参照渡しにしないと毎回deep copyになる(たぶん、少なくとも処理が遅くなってTLEになった)。

結論: &をつける。

// 良い例(vectorのshallow copy)
bool dfs(vector<string>& s, int n){
}
// 悪い例(vectorのdeep copy)
bool dfs(vector<string> s, int n){
}

Comments

タイトルとURLをコピーしました