long doubleで小数を読み込むならEPS足しとけ

  • 具体的にはこの問題
  • 本番では文字列で読み込んで1e9倍することで誤差を完全に消してACしたが、EPSで誤差を解消できればもっと速く解けた
  • 具体的にはここ
using ld = long double;
#define EPS (1e-14)

VI A(N);
rep(i, N){
  ld a;cin>>a;
  a += EPS; // これがないとWA
  A[i] = 1e9 * a;
}
  • 入力として17.000000001などが入力されうるが、long doubleで受け取った時に17.00000000099999999になったりする

その他

  • そしてこの誤差はローカルでは発生せず、提出したらサンプルでWAで発生したので厄介だった。コンパイラを合わせればいいのかな?
  • 論理は合っているのにWAになる例として以下があり、注意していきたい
    • 小数の誤差 (EPSで対応)
    • ロリハが衝突 (提出後にmodを変えて結果が変わるなら衝突)

roundしてもいい

ll num = round(a[i] * 1e9);

llround !?

ll num = llround(x*1e9), cnt2 = 0, cnt5 = 0;