Problem p02616 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;
#define ALL(x) x.begin(), x.end()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define debug(v)                                                               \\
  cout << #v << ":";                                                           \\
  for (auto x : v) {                                                           \\
    cout << x << ' ';                                                          \\
  }                                                                            \\
  cout << endl;
#define mod 1000000007
using ll = long long;
const int INF = 1000000000;
const ll LINF = 1001002003004005006ll;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
// ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}

struct IOSetup {
  IOSetup() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    cout << fixed << setprecision(12);
  }
} iosetup;

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  os << p.first << " " << p.second;
  return os;
}

template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  for (int i = 0; i < (int)v.size(); i++)
    os << v[i] << (i + 1 == v.size() ? "" : " ");
  return os;
}

template <ll Mod> struct ModInt {
  long long x;
  ModInt() : x(0) {}
  ModInt(long long y) : x(y >= 0 ? y % Mod : (Mod - (-y) % Mod) % Mod) {}
  ModInt &operator+=(const ModInt &p) {
    if ((x += p.x) >= Mod)
      x -= Mod;
    return *this;
  }
  ModInt &operator-=(const ModInt &p) {
    if ((x += Mod - p.x) >= Mod)
      x -= Mod;
    return *this;
  }
  ModInt &operator*=(const ModInt &p) {
    x = (int)(1ll * x * p.x % Mod);
    return *this;
  }
  ModInt &operator/=(const ModInt &p) {
    (*this) *= p.inverse();
    return *this;
  }
  ModInt operator-() const { return ModInt(x); }
  ModInt operator+(const ModInt &p) const { return ModInt(*this) += p; }
  ModInt operator-(const ModInt &p) const { return ModInt(*this) -= p; }
  ModInt operator*(const ModInt &p) const { return ModInt(*this) *= p; }
  ModInt operator/(const ModInt &p) const { return ModInt(*this) /= p; }
  ModInt operator==(const ModInt &p) const { return x == p.x; }
  ModInt operator!=(const ModInt &p) const { return x != p.x; }
  ModInt inverse() const {
    int a = x, b = Mod, u = 1, v = 0, t;
    while (b > 0) {
      t = a / b;
      swap(a -= t * b, b);
      swap(u -= t * v, v);
    }
    return ModInt(u);
  }
  ModInt pow(long long n) const {
    ModInt ret(1), mul(x);
    while (n > 0) {
      if (n & 1)
        ret *= mul;
      mul *= mul;
      n >>= 1;
    }
    return ret;
  }
  friend ostream &operator<<(ostream &os, const ModInt &p) { return os << p.x; }
  friend istream &operator>>(istream &is, ModInt &a) {
    long long t;
    is >> t;
    a = ModInt<Mod>(t);
    return (is);
  }
  static int get_mod() { return Mod; }
};
using mint = ModInt<mod>;

signed main() {
  int n, k;
  cin >> n >> k;

  if (n == k) {
    mint ans = 1;
    rep(i, n) {
      mint t;
      cin >> t;
      ans *= t;
    }
    cout << ans << endl;
    return 0;
  }

  vector<ll> a, b;
  int c = 0;
  rep(i, n) {
    ll t;
    cin >> t;
    if (t < 0)
      b.push_back(-t);
    else if (t > 0)
      a.push_back(t);
    else
      c++;
  }
  if (a.size() + b.size() < k) {
    cout << 0 << endl;
    return 0;
  }
  sort(ALL(a));
  reverse(ALL(a));
  sort(ALL(b));
  reverse(ALL(b));

  vector<long double> la(a.size()), lb(b.size());
  rep(i, a.size()) la[i] = log((long double)(a[i]));
  rep(i, b.size()) lb[i] = log((long double)(b[i]));

  vector<long double> lasum(a.size() + 1, 0), lbsum(b.size() + 1, 0);
  rep(i, a.size()) lasum[i + 1] = lasum[i] + la[i];
  rep(i, b.size()) lbsum[i + 1] = lbsum[i] + lb[i];

  if (la.empty()) {
    ll ans = 1;
    if (k % 2) {
      reverse(ALL(b));
      rep(i, k) ans = ans * (mod - b[i]) % mod;
      if (c)
        ans = 0;
    } else {
      rep(i, k) ans = ans * b[i] % mod;
    }
    cout << ans << endl;
    return 0;
  }

  int memo = -1;
  long double res = -1000000;

  for (int i = 0; i <= k; i++) {
    int rem = k - i;
    if (i > lb.size())
      continue;
    if (rem > la.size())
      continue;
    long double u = lbsum[i] + lasum[rem];
    if (i % 2 == 0) {
      if (chmax(res, u))
        memo = i;
    } else {
      if (chmax(res, -u))
        memo = i;
    }
  }
  if (memo % 2 and c) {
    cout << 0 << endl;
    return 0;
  }

  mint ans = 1;
  rep(i, memo) ans *= mint(b[i]);
  rep(i, k - memo) ans *= mint(a[i]);
  cout << ans << endl;
  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define ALL(x) x.begin(), x.end()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define debug(v)                                                               \\
  cout << #v << ":";                                                           \\
  for (auto x : v) {                                                           \\
    cout << x << ' ';                                                          \\
  }                                                                            \\
  cout << endl;
#define mod 1000000007
using ll = long long;
const int INF = 1000000000;
const ll LINF = 1001002003004005006ll;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
// ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}

struct IOSetup {
  IOSetup() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    cout << fixed << setprecision(12);
  }
} iosetup;

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  os << p.first << " " << p.second;
  return os;
}

template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  for (int i = 0; i < (int)v.size(); i++)
    os << v[i] << (i + 1 == v.size() ? "" : " ");
  return os;
}

signed main() {
  int n, k;
  cin >> n >> k;
  vector<ll> a, b;
  int c = 0;
  rep(i, n) {
    ll t;
    cin >> t;
    if (t < 0)
      b.push_back(-t);
    else if (t > 0)
      a.push_back(t);
    else
      c++;
  }
  if (a.size() + b.size() < k) {
    cout << 0 << endl;
    return 0;
  }
  sort(ALL(a));
  reverse(ALL(a));
  sort(ALL(b));
  reverse(ALL(b));

  vector<long double> la(a.size()), lb(b.size());
  rep(i, a.size()) la[i] = log((long double)(a[i]));
  rep(i, b.size()) lb[i] = log((long double)(b[i]));

  vector<long double> lasum(a.size() + 1, 0), lbsum(b.size() + 1, 0);
  rep(i, a.size()) lasum[i + 1] = lasum[i] + la[i];
  rep(i, b.size()) lbsum[i + 1] = lbsum[i] + lb[i];

  if (la.empty()) {
    ll ans = 1;
    if (k % 2) {
      reverse(ALL(b));
      rep(i, k) ans = ans * (mod - b[i]) % mod;
      if (c)
        ans = 0;
    } else {
      rep(i, k) ans = ans * b[i] % mod;
    }
    cout << ans << endl;
    assert(false);
    return 0;
  }

  int memo = -1;
  long double res = -1000000;

  for (int i = 0; i <= k; i += 2) {
    int rem = k - i;
    if (i > lb.size())
      continue;
    if (rem > la.size())
      continue;
    long double u = lbsum[i] + lasum[rem];
    if (i % 2 == 0) {
      if (chmax(res, u))
        memo = i;
    } else {
      if (chmax(res, -u))
        memo = i;
    }
  }

  ll ans = 1;
  rep(i, memo) ans = ans * (mod - b[i]) % mod;
  rep(i, k - memo) ans = ans * a[i] % mod;
  cout << ans << endl;
  return 0;
}