はじめに
この記事では競技プログラミングでよく使うものや知っておくと便利なものについてまとめる。 絶対に正しいとは言えない(保険)。 コード集というよりも、勉強になるウェブサイトのリンク集になりそう。
言語はC++。
よく使うコード集
基本
#include <bits/stdc++.h> using namespace std; int main() { }
探索
二分探索
- けんちょんさんのコードを拝借
- 二分探索アルゴリズムを一般化 〜 めぐる式二分探索法のススメ 〜 - Qiita
- lower_boundについて:lower_bound - cpprefjp C++日本語リファレンス
// ソート済みの配列 vector<int> s; int binary_search(int key) { int ng = -1; int ok = (int)s.size(); while (abs(ok - ng) > 1) { int mid = (ok + ng) / 2; if (s[mid] >= key) ok = mid; else ng = mid; } return ok; }
グラフ
グラフ作成
- グラフの持ち方には
隣接リスト
と隣接行列
があるらしい
// グラフ用の二次元配列 vector<vector<int>> g; int main() { // 頂点の個数nの分だけ配列の長さを確保 g.resize(n); // 辺(頂点u→頂点v)を受け取ってグラフを作る for(int i = 0; i < m; ++i) { int u, v; cin >> u >> v; u--; v--; g[u].emplace_back(v); g[v].emplace_back(u); } }
データ構造
stack
- LIFO(last in, first out)
- 参考:stack - cpprefjp C++日本語リファレンス
stack<int> st; st.push(3); // 追加 st.push(5); st.size(); // 要素数取得 → 2 int a = st.top(); // 末尾参照 → 5 st.pop(); // 末尾削除
queue
- FIFO(first in, first out)
- 参考:queue - cpprefjp C++日本語リファレンス
queue<int> que; que.push(3); // 追加 que.push(5); cout << que.size(); // 要素数取得 → 2 int a = que.front(); // 先頭参照 → 3 que.pop(); // 先頭削除
算数・数学
素数判定
bool isprime(int n) { if(n < 2) return false; for(int i = 2; i*i <= n; ++i) { if(n % i == 0) return false; } return true; }
最大公約数(gcd)
- いわゆるユークリッドの互除法(名前がカッコいい)
- けんちょんさんのコードを拝借
- AtCoder 版!マスター・オブ・整数 (最大公約数編) - Qiita
int gcd(int a, int b) { if (b == 0) return a; else return gcd(b, a % b); }
二項係数(nCk)
- けんちょんさんの記事を参考
- よくやる二項係数 (nCk mod. p)、逆元 (a^-1 mod. p) の求め方 - けんちょんの競プロ精進記録
- コードは、けんちょんさんの記事から拝借する
順列
- 次の順列を求める
string s = "abc"; next_permutation(s.begin(),s.end()); cout << s << endl; // "acb"
modの話
- 「1000000007で割った余りを出力せよ」と言われたときの話
- 参考1:1000000007で割ったあまりを求める問題勉強メモ - Qiita
- 参考2:数学的な性質 Wiki - yukicoder
long long mod = 1000000007; int main() { long long ans = 0; // 足すたびにmodをとる for(int i = 0; i < n; ++i) { cin >> t; ans += (t % mod); ans %= mod; } // 掛けるたびにmodをとる for(int i = 0; i < n; ++i) { cin >> t; ans *= (t % mod); ans %= mod; } }
繰り返し二乗法
- 累乗の計算を高速に
- modも取りながら計算
- 参考:【競プロ】繰り返し二乗法と再帰関数 | なかけんの数学ノート
素数判定・テーブル作成
- 素数関連はコピペさせてもらうと早い
- 素数判定:素数判定(Is-Prime) | Luzhiled’s memo
- テーブル作成:素数テーブル(Prime-Table) | Luzhiled’s memo
フェルマーの小定理
- 競プロにおいて稀によく出てくる
- 参考1:フェルマーの小定理の証明と例題 | 高校数学の美しい物語
- 参考2:【競プロ】フェルマーの小定理 | なかけんの数学ノート
中国剰余定理
- 競プロにおいて稀によく出てくる
- 参考1:中国剰余定理の証明と例題(二元の場合) | 高校数学の美しい物語
- 参考2:中国剰余定理 カテゴリーの記事一覧 - けんちょんの競プロ精進記録
小技コード集
10進数の各桁の和
// 10進数の非負整数を渡すと、各桁の和が返ってくる int digits_sum(int x) { int sum = 0; while(x > 0) { sum += x % 10; x /= 10; } return sum; }
進数変換
// 8進数の場合 string to_oct(int n){ string s; while(n){ s = to_string(n%8) + s; n /= 8; } return s; }
円周率
double PI = acos(-1);
小数点の桁数指定
printf("%.10f\n", ans);
図形の回転
char s0[n][n]; char s1[n][n]; // s0を90度回転 for(int i = 0; i < n; ++i) for(int j = 0; j < n; ++j) s1[i][j] = s0[j][n-1-i];
三項演算子
bool flag = true; cout << (flag? "Yes" : "No") << endl;
座標圧縮
配列の重複削除
sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end());
文字列からn文字抜き取り
- i番目からn文字を抜き取る
s.substr(i, n)
知っておくと良いこと
cin, cout
よりもscanf, printf
を使ったほうがおそらく速い- 普段から
long long
を使っておけば忘れずに済む #include <bits/stdc++.h>
は便利using namespace std;
は便利
勉強・参考になるウェブサイト
- けんちょんさんQiita:drken - Qiita
- けんちょんさんHatena:けんちょんの競プロ精進記録
- C++の勉強: C++入門 AtCoder Programming Guide for beginners (APG4b) - AtCoder
- 競プロライブラリ:Luzhiled’s memo | C++による競技プログラミングのライブラリです
- 競プロ数学:【競プロ】記事の一覧 | なかけんの数学ノート
- 競プロに役立つ話など:えびちゃんの日記
- かつっぱさんYouTube:かつっぱ競プロ - YouTube
- AtCoder YouTube:AtCoder Live - YouTube
- アルゴ式:アルゴ式
競プロにはそこまで関係ないけど
競プロの書籍
また解きたい問題集
- ABC249 : C - Just K → bit全探索
- ABC246 : D - 2-variable Function → 二分探索
- ABC220 : D - FG operation → DP
- ABC219 : C - Neo-lexicographic Ordering → 辞書変換
- ABC218 : D - Rectangles → 図形問題
- ABC217 : D - Cutting Woods
- ABC215 : C - One More aab aba baa → 順列
- ABC214 : C - Distribution
- ABC213 : C - Reorder Cards → 座標圧縮
- ABC210 : C - Colorful Candies → map
- ABC197 : C - ORXOR → bit全探索
- ABC197 : D - Opposite → 図形&複素数
- ABC188 : D - Snuke Prime → 問題文の言い換え
- ABC188 : F - +1-1x2 → 考察&メモ化再帰
- ABC187 : A - Large Digits → 文字列操作
- ABC186 : F - Rook on Grid → FenwickTree(BIT)
おわりに
やる気が続く限り、このページを更新していきたい。