Open1

long long と int64_t の違い

log5log5

https://cpprefjp.github.io/lang/cpp11/long_long_type.html

long longは64ビット以上の幅であることが保証されるが、64ビット固定の整数型が必要な場合には、int64_t型を使用することを推奨する

といった説明がされているが、今まであまりピンとこなかった...

ちなみに、APG4bだと 3.01 で 「int64_tが一般的」という説明がある。
https://atcoder.jp/contests/apg4b/tasks/APG4b_y?lang=ja

ところが、AtCoderのコンテストで「long long は良くても int64_t だとエラーになるケース」が見つかり、「long long を使わないといけないケースが有る」ということを知った。
https://atcoder.jp/contests/arc112/submissions/20166351
https://atcoder.jp/contests/arc112/submissions/20166996

エラーメッセージには

./Main.cpp:21:59: error: no matching function for call to ‘max(long long int, long int)’
   21 |     ll duplicated = max(0ll, min(r1, r2) - max(l1, l2) + 1);
      |                                                   

とあり、 min(r1, r2) - max(l1, l2) + 1) の部分が long int と解釈された(long long int ではないと解釈された)ようにみえる。

std::min および 中の std::max の定義を調べると

  template<typename _Tp>
    _GLIBCXX14_CONSTEXPR
    inline const _Tp&
    min(const _Tp& __a, const _Tp& __b) { ... }

  template<typename _Tp>
    _GLIBCXX14_CONSTEXPR
    inline const _Tp&
    max(const _Tp& __a, const _Tp& __b) { ... }

となっているので、すなわち r1, r2 の型である int64_t が使われているはず...
なので、結果として int64_tlong int と解釈されたことになるのかな...?

int64_t の定義を見に行くと、

#ifndef _INT64_T
#define _INT64_T
typedef long long               int64_t;
#endif 

とあったので、結局「環境によっては long int に解釈されちゃう」という話になるのかな...
ひとまずそれで理解することにして、今後似たような問題にぶつかったら long long を試す、という方法で...