よくあるバグ

前提

  • コンパイルするファイルが間違っている
  • 実行するファイルが間違っている
  • 実はコンパイルに失敗していて,最後にコンパイルが成功したファイルを実行している

コンパイルできない

  • ヘッダがない
    • 人のコードパクってきたときにfuncionalヘッダがなかった
  • using namespaceがない
  • 変数名とdefineの重複
  • vector<vector<long>> A(N,vector<int>(0))みたいに型が一致していない
  • <Templete T>の書き忘れ

コーナーケース

  • N=1,K=0などの極端な値
  • A=Bのとき
  • 同じクエリが複数回来るかもしれない
  • 自己ループ,同じ辺
  • 0の0乗,0の階乗の定義

実行が終わらない

  • 入力を受け取りすぎている
    • クエリの数Qと要素数Nが混同してしまう
  • n重for文でインクリメントする変数を間違える
  • n重for文で変数名が重複
  • 計算量が多い
    • setに要素を大量に入れている可能性

セグフォ

  • cinを忘れている
  • 二項係数ライブラリとかの前計算した配列の範囲外参照
  • 文字列の操作中に空文字が登場する
  • 0,1-indexedの混同
    • セグ木とかに多い

その他ハマり

modを正しく取れていない

  • modを取ってない
  • mod(法)の値が間違っている(998244353,1e9+7)
  • modの取り方を間違っている
    • 法が素数でない,逆元が存在しない
    • mod 3とかでの二項係数はルーカスの定理を使う
  • modを取りながら累積和したときに負の数がでる
    • (A[r]-A[l-1]+mod)%modみたいな配慮
    • modint構造体を使おう
  • 最後にマイナス1などをしている(0のときに-1が出力されてしまう)

セグ木

  • 実はモノイドではなかった
  • 単位元が間違っている
    • 更新クエリの単位元を$0$にすると壊れる場合がある
  • ビルドができていない

二分探索

  • 初期値で候補から外れている値が実は答え
    • 答えの上限値が10^9なのに二分探索の上限の初期値を10^9にしている

未分類

  • 改行(flush)しないと標準出力にでてこない
  • cin>>a,b;みたいなことをしている
    • エラーが出ないことがあるのでハマりやすい
  • switch文でbreak忘れ
  • make cleanを試す
  • 型のパース,intをlongの計算にそのまま突っ込むのは良くない
  • 調和級数の計算量勘違い
  • コンストラクタの名前を間違えている
  • 閉区間,半開区間などの違い
    • 累積和で区間和を出す場合に注意
  • setmapstd::lower_boundなどは使えない
    • メソッドとして用意されている
  • 01ナップザックで昇順にdpを回してしまった
    • それは個数制限なし
  • bool型をint型だと思って
    • bool値に2以上を入れてもサイレントに1になる
  • ソート後の配列をソート前の状態として扱ってしまった
  • 格子点とグリッドマス目の関係
    • 角の座標の扱い
  • 不等式における累乗の注意
    • 偶数乗した場合負の数が正になる
  • ビットシフト演算子の計算順序
    • 四則演算のほうが早い(1<<2+21<<416になる)
  • long型リテラルにしわすれてオーバーフロー
    • 1<<40はオーバーフローする.1L<<40が正しい.