提出 #15050255
ソースコード 拡げる
#include<bits/stdc++.h>
#define rep(i, x) for (ll i = 0; i < (x); i++)
#define chmax(x, a) do { x = max(x, a); } while(0)
template<typename T>
using reversed_priority_queue = \
std::priority_queue<T, std::vector<T>, std::greater<T> >;
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
// {{{ Modint
// using mint = modint<1000000007>;
// mint x = 2;
// mint y = mint::P(5, 2);
// std::cout << x.a << std::endl;
template <std::int64_t M>
class modint {
public:
int64_t a;
static std::vector<modint> fact;
static std::vector<modint> inv_fact;
explicit constexpr modint(const int64_t x = 0) noexcept :
a((x % M + M) % M) {}
constexpr int64_t &value() noexcept { return a; }
constexpr const int64_t &value() const noexcept { return a; }
constexpr modint operator+(const modint rhs) const noexcept {
return modint(*this) += rhs;
}
constexpr modint operator-(const modint rhs) const noexcept {
return modint(*this) -= rhs;
}
constexpr modint operator*(const modint rhs) const noexcept {
return modint(*this) *= rhs;
}
constexpr modint operator/(const modint rhs) const noexcept {
return modint(*this) /= rhs;
}
constexpr modint &operator+=(const modint rhs) noexcept {
a += rhs.a;
if (a >= M) {
a -= M;
}
return *this;
}
constexpr modint &operator-=(const modint rhs) noexcept {
if (a < rhs.a) {
a += M;
}
a -= rhs.a;
return *this;
}
constexpr modint &operator*=(const modint rhs) noexcept {
a = a * rhs.a % M;
return *this;
}
constexpr modint &operator/=(modint rhs) noexcept {
int64_t exp = M - 2;
while (exp) {
if (exp % 2) {
*this *= rhs;
}
rhs *= rhs;
exp /= 2;
}
return *this;
}
constexpr modint pow(ll t) const {
if (!t) return modint(1);
modint a = pow(t>>1);
a *= a;
if (t&1) a *= *this;
return a;
}
static modint P(ll n, ll k) {
if (fact.size() == 0) {
const ll T = 3000000;
fact.resize(T, modint(1));
inv_fact.resize(T, modint(1));
for (ll i = 2; i < T; i++) fact[i] = fact[i-1] * modint(i);
for (ll i = 2; i < T; i++) inv_fact[i] = inv_fact[i-1] / modint(i);
}
if (n < k) return modint(0);
if (n < 0 || k < 0) return modint(0);
return fact[n] * inv_fact[n - k];
}
static modint C(ll n, ll k) {
if (n < k) return modint(0);
if (n < 0 || k < 0) return modint(0);
return P(n, k) * inv_fact[k];
}
};
template <std::int64_t M>
std::vector<modint<M>> modint<M>::fact;
template <std::int64_t M>
std::vector<modint<M>> modint<M>::inv_fact;
// }}}
using mint = modint<1000000007>;
int main(void) {
ll N, K;
cin >> N >> K;
deque<ll> a; // 非負数を降順 9 6 5 ...
deque<ll> b; // 負数を昇順 -8 -7 -3 ...
deque<ll> c; // すべての要素
{
vector<ll> av;
vector<ll> bv;
vector<ll> cv;
rep(i, N) {
ll x;
cin >> x;
if (x >= 0) av.push_back(x);
else bv.push_back(x);
cv.push_back(x);
}
sort(begin(av), end(av), greater<ll>());
sort(begin(bv), end(bv));
sort(begin(cv), end(cv), [](const ll l, const ll r) {
if (abs(l) == abs(r))
return l > r;
else
return abs(l) < abs(r);
});
rep(i, av.size()) a.push_back(av[i]);
rep(i, bv.size()) b.push_back(bv[i]);
rep(i, cv.size()) c.push_back(cv[i]);
}
// 答えが負数になる場合
mint ans_min(1);
rep(i, K)
ans_min *= mint(c[i]);
// 答えが正数になる場合
mint ans(1);
while(K >= 2 && a.size() >= 2 && b.size() >= 2) {
ll av = a[0] * a[1];
ll bv = b[0] * b[1];
if (av > bv) {
ans *= mint(a[0]); // 1個だけ取るのが肝!
a.erase(a.begin());
K--;
} else {
ans *= mint(b[0]) * mint(b[1]);
b.erase(b.begin());
b.erase(b.begin());
K-=2;
}
}
if (K >= 2) {
if (a.size() <= 1) {
while (K >= 2 && b.size() >= 2) {
ans *= mint(b[0]) * mint(b[1]);
b.erase(b.begin());
b.erase(b.begin());
K-=2;
}
} else { // b.size() <= 1
while (K > 0 && a.size() > 0) {
ans *= mint(a[0]);
a.erase(a.begin());
K--;
}
}
}
if (K == 0) {
cout << ans.value() << endl;
return 0;
}
if (K == 1) {
if (a.size() > 0) {
ans *= mint(a[0]);
} else { // b.size() > 0
ans = ans_min;
}
cout << ans.value() << endl;
K--;
return 0;
}
return 0;
}
提出情報
コンパイルエラー
./Main.cpp: In function ‘int main()’:
./Main.cpp:2:36: warning: comparison of integer expressions of different signedness: ‘ll’ {aka ‘long long int’} and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
2 | #define rep(i, x) for (ll i = 0; i < (x); i++)
| ^
./Main.cpp:127:5: note: in expansion of macro ‘rep’
127 | rep(i, av.size()) a.push_back(av[i]);
| ^~~
./Main.cpp:2:36: warning: comparison of integer expressions of different signedness: ‘ll’ {aka ‘long long int’} and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
2 | #define rep(i, x) for (ll i = 0; i < (x); i++)
| ^
./Main.cpp:128:5: note: in expansion of macro ‘rep’
128 | rep(i, bv.size()) b.push_back(bv[i]);
| ^~~
./Main.cpp:2:36: warning: comparison of integer expressions of different signedness: ‘ll’ {aka ‘long long int’} and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
2 | #define rep(i, x) for (ll i = 0; i < (x); i++)
| ^
./Main.cpp:129:5: note: in expansion of macro ‘rep’
129 | rep(i, cv.size()) c.push_back(cv[i]);
| ^~~
ジャッジ結果
| セット名 |
Sample |
All |
after_contest |
| 得点 / 配点 |
0 / 0 |
500 / 500 |
0 / 0 |
| 結果 |
|
|
|
| セット名 |
テストケース |
| Sample |
sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt |
| All |
hand_01.txt, hand_02.txt, hand_03.txt, hand_04.txt, hand_05.txt, random_m01.txt, random_m02.txt, random_m03.txt, random_m04.txt, random_m05.txt, random_m06.txt, random_max01.txt, random_max02.txt, random_mz01.txt, random_mz02.txt, random_mz03.txt, random_p01.txt, random_p02.txt, random_pm00.txt, random_pm01.txt, random_pm02.txt, random_pm03.txt, random_pm11.txt, random_pm12.txt, random_pmz01.txt, random_pmz02.txt, random_pmz03.txt, random_pmz04.txt, random_pmz11.txt, random_pmz12.txt, random_pmz13.txt, random_pz01.txt, random_pz02.txt, random_pz03.txt, random_z01.txt, sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt |
| after_contest |
after_contest_01.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| after_contest_01.txt |
AC |
86 ms |
9728 KiB |
| hand_01.txt |
AC |
82 ms |
9652 KiB |
| hand_02.txt |
AC |
95 ms |
9648 KiB |
| hand_03.txt |
AC |
91 ms |
9720 KiB |
| hand_04.txt |
AC |
88 ms |
9504 KiB |
| hand_05.txt |
AC |
89 ms |
9460 KiB |
| random_m01.txt |
AC |
45 ms |
5272 KiB |
| random_m02.txt |
AC |
19 ms |
3844 KiB |
| random_m03.txt |
AC |
52 ms |
5756 KiB |
| random_m04.txt |
AC |
98 ms |
8780 KiB |
| random_m05.txt |
AC |
84 ms |
7804 KiB |
| random_m06.txt |
AC |
22 ms |
3900 KiB |
| random_max01.txt |
AC |
109 ms |
9636 KiB |
| random_max02.txt |
AC |
104 ms |
9620 KiB |
| random_mz01.txt |
AC |
66 ms |
6516 KiB |
| random_mz02.txt |
AC |
14 ms |
3928 KiB |
| random_mz03.txt |
AC |
9 ms |
3900 KiB |
| random_p01.txt |
AC |
57 ms |
6512 KiB |
| random_p02.txt |
AC |
50 ms |
6020 KiB |
| random_pm00.txt |
AC |
32 ms |
4344 KiB |
| random_pm01.txt |
AC |
41 ms |
4916 KiB |
| random_pm02.txt |
AC |
74 ms |
7004 KiB |
| random_pm03.txt |
AC |
45 ms |
5324 KiB |
| random_pm11.txt |
AC |
60 ms |
6504 KiB |
| random_pm12.txt |
AC |
19 ms |
3676 KiB |
| random_pmz01.txt |
AC |
63 ms |
6764 KiB |
| random_pmz02.txt |
AC |
91 ms |
8784 KiB |
| random_pmz03.txt |
AC |
43 ms |
5120 KiB |
| random_pmz04.txt |
AC |
48 ms |
5484 KiB |
| random_pmz11.txt |
AC |
58 ms |
6544 KiB |
| random_pmz12.txt |
AC |
17 ms |
3824 KiB |
| random_pmz13.txt |
AC |
56 ms |
6620 KiB |
| random_pz01.txt |
AC |
40 ms |
5272 KiB |
| random_pz02.txt |
AC |
75 ms |
8064 KiB |
| random_pz03.txt |
AC |
31 ms |
7616 KiB |
| random_z01.txt |
AC |
47 ms |
9044 KiB |
| sample_01.txt |
AC |
2 ms |
3424 KiB |
| sample_02.txt |
AC |
3 ms |
3556 KiB |
| sample_03.txt |
AC |
2 ms |
3476 KiB |
| sample_04.txt |
AC |
2 ms |
3424 KiB |