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

// ヘッダー
#include <bits/stdc++.h>
using namespace std;

// 型定義
typedef long long ll;

// 定数
const int INF = 1e+9;
const int MOD = 1e+9 + 7;

// REPマクロ
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define REP2(i, a, b) for (ll i = a; i < (ll)(b); i++)
#define REPD2(i, a, b) for (ll i = a; i > (ll)(b); i--)

// 多次元 vector 生成
template <class T> vector<T> make_vec(size_t a) { return vector<T>(a); }
template <class T, class... Ts> auto make_vec(size_t a, Ts... ts) {
  return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}

// vectorの扱い
#define ALL(x) (x).begin(), (x).end() // sortなどの引数省略
#define SIZE(x) ((ll)(x).size())      // size
#define MAX(x) *max_element(ALL(x))   // 最大値
#define MIN(x) *min_element(ALL(x))   // 最小値

// xのn乗%modを計算
ll mod_pow(ll x, ll n, ll mod) {
  ll res = 1;
  while (n > 0) {
    if (n & 1)
      res = res * x % mod;
    x = x * x % mod;
    n >>= 1;
  }
  return res;
}

int main() {
  ll N, K;
  cin >> N >> K;
  vector<ll> A(N);
  vector<ll> minus;
  vector<ll> plus;
  ll cnt0 = 0;

  REP(i, N) {
    cin >> A[i];
    if (A[i] == 0)
      cnt0++;
    if (A[i] >= 0) {
      plus.push_back(A[i]);
    }
    if (A[i] < 0) {
      minus.push_back(-A[i]);
    }
  }
  ll ans;
  sort(ALL(A), greater<ll>());
  sort(ALL(plus), greater<ll>());
  sort(ALL(minus), greater<ll>());

  if (N == K || plus.size() == 0) {
    ans = 1;
    if (K % 2 == 0) {
      sort(ALL(A));

      REP(i, K) {
        ans *= A[i];
        ans %= MOD;
      }
    } else {
      REP(i, K) {
        ans *= A[i];
        ans %= MOD;
      }
    }
  } else if (plus.size() == 1 && K % 2 == 0) {
    minus.push_back(plus[0]);
    sort(ALL(minus));
    ans = 1;
    REP(i, K) {
      ans *= minus[i];
      ans %= MOD;
    }
  } else { // 答えがプラス
    if (K % 2 == 0) {
      ans = 1;
      vector<ll> MINUS;
      REP(i, minus.size()) {
        if (2 * i + 1 >= minus.size())
          break;
        MINUS.push_back(minus[2 * i] * minus[2 * i + 1]);
      }

      REP(i, plus.size()) {
        if (2 * i + 1 >= plus.size())
          break;
        MINUS.push_back(plus[2 * i] * plus[2 * i + 1]);
      }
      sort(ALL(MINUS), greater<ll>());
      REP(i, K / 2) {
        ans *= MINUS[i] % MOD;
        ans %= MOD;
      }
    } else {
      ans = plus[0];
      vector<ll> MINUS;
      REP(i, minus.size()) {
        if (2 * i + 1 >= minus.size())
          break;
        MINUS.push_back(minus[2 * i] * minus[2 * i + 1]);
      }

      REP(i, plus.size()) {
        if (2 * i + 2 >= plus.size())
          break;
        MINUS.push_back(plus[2 * i + 1] * plus[2 * i + 2]);
      }
      sort(ALL(MINUS), greater<ll>());
      REP(i, (K - 1) / 2) {
        ans *= MINUS[i] % MOD;
        ans %= MOD;
      }
    }
  }

  while (ans < 0) {
    ans += MOD;
  }
  cout << ans << endl;
}


Error: 0

Fixed submission:

// ヘッダー
#include <bits/stdc++.h>
using namespace std;

// 型定義
typedef long long ll;

// 定数
const int INF = 1e+9;
const int MOD = 1e+9 + 7;

// REPマクロ
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define REP2(i, a, b) for (ll i = a; i < (ll)(b); i++)
#define REPD2(i, a, b) for (ll i = a; i > (ll)(b); i--)

// 多次元 vector 生成
template <class T> vector<T> make_vec(size_t a) { return vector<T>(a); }
template <class T, class... Ts> auto make_vec(size_t a, Ts... ts) {
  return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}

// vectorの扱い
#define ALL(x) (x).begin(), (x).end() // sortなどの引数省略
#define SIZE(x) ((ll)(x).size())      // size
#define MAX(x) *max_element(ALL(x))   // 最大値
#define MIN(x) *min_element(ALL(x))   // 最小値

// xのn乗%modを計算
ll mod_pow(ll x, ll n, ll mod) {
  ll res = 1;
  while (n > 0) {
    if (n & 1)
      res = res * x % mod;
    x = x * x % mod;
    n >>= 1;
  }
  return res;
}

int main() {
  ll N, K;
  cin >> N >> K;
  vector<ll> A(N);
  vector<ll> minus;
  vector<ll> plus;
  ll cnt0 = 0;

  REP(i, N) {
    cin >> A[i];
    if (A[i] == 0)
      cnt0++;
    if (A[i] >= 0) {
      plus.push_back(A[i]);
    }
    if (A[i] < 0) {
      minus.push_back(-A[i]);
    }
  }
  ll ans = 1;
  sort(ALL(A), greater<ll>());
  sort(ALL(plus), greater<ll>());
  sort(ALL(minus), greater<ll>());

  plus.push_back(-1);
  minus.push_back(-1);

  ll i_p = 0;
  ll i_m = 0;

  REP(i, K) {
    if (plus[i_p] >= minus[i_m]) {
      ans *= plus[i_p];
      i_p++;
    }

    if (minus[i_m] > plus[i_m]) {
      ans *= minus[i_m];
      i_m++;
    }

    ans %= MOD;
  }

  ans *= pow(-1, i_m);

  plus.pop_back();
  minus.pop_back();

  // コーナー
  if (ans > 0) { // OK

  } else if (N == K) {
    ans = 1;
    REP(i, N) {
      ans *= A[i];
      ans %= MOD;
    }
  } else if (plus.size() == 0 && K % 2 == 1) { // 答えが0orマイナス
    if (cnt0 > 0) {
      ans = 0;
    } else {
      ans = -1;
      sort(ALL(minus));
      REP(i, K) {
        ans *= minus[i];
        ans %= MOD;
      }
    }
  } else if (ans < 0) { // 答えがプラス
    if (K % 2 == 0) {
      ans = 1;
      vector<ll> MINUS;
      REP(i, minus.size()) {
        if (i + 1 >= minus.size())
          break;
        MINUS.push_back(minus[i] * minus[i + 1]);
      }

      REP(i, plus.size()) {
        if (i + 1 >= plus.size())
          break;
        MINUS.push_back(plus[i] * plus[i + 1]);
      }
      sort(ALL(MINUS), greater<ll>());
      REP(i, K / 2) {
        ans *= MINUS[i];
        ans %= MOD;
      }
    } else {
      ans = plus[0];
      vector<ll> MINUS;
      REP(i, minus.size()) {
        if (i + 1 >= minus.size())
          break;
        MINUS.push_back(minus[i] * minus[i + 1]);
      }

      REP2(i, 1, plus.size()) {
        if (i + 1 >= plus.size())
          break;
        MINUS.push_back(plus[i] * plus[i + 1]);
      }
      sort(ALL(MINUS), greater<ll>());
      REP(i, K / 2) {
        ans *= MINUS[i];
        ans %= MOD;
      }
    }
  }

  while (ans < 0) {
    ans += MOD;
  }
  cout << ans << endl;
}