結果
| 問題 |
No.3129 Multiple of Twin Subarray
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-04-25 22:52:26 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,928 bytes |
| コンパイル時間 | 932 ms |
| コンパイル使用メモリ | 86,584 KB |
| 実行使用メモリ | 7,936 KB |
| 最終ジャッジ日時 | 2025-04-25 22:52:44 |
| 合計ジャッジ時間 | 3,149 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 WA * 18 |
ソースコード
#include <iostream>
#include <cstdint>
#include <vector>
using namespace std;
template<typename T> static inline constexpr T chmax(T& variable, const T value) noexcept
{
if (variable < value) return (variable = value);
else return variable;
}
template<typename T> static inline constexpr T chmin(T& variable, const T value) noexcept
{
if (variable < value) return variable;
else return (variable = value);
}
static inline constexpr int64_t solve(const uint32_t N, const vector<int32_t>& A)
{
vector<int32_t> S(N), max_sum_from_left_by(N), min_sum_from_left_by(N);
S[0] = A[0];
max_sum_from_left_by[0] = S[0], min_sum_from_left_by[0] = S[0];
int32_t max_csum = S[0], min_csum = S[0];
for (uint32_t i = 1; i != N; ++i)
{
S[i] = S[i - 1] + A[i];
max_sum_from_left_by[i] = max(max_sum_from_left_by[i - 1], S[i] - min_csum);
min_sum_from_left_by[i] = min(min_sum_from_left_by[i - 1], S[i] - max_csum);
chmax(max_csum, S[i]), chmin(min_csum, S[i]);
}
vector<int32_t> max_sum_from_right_by(N), min_sum_from_right_by(N);
S[N - 1] = A[N - 1];
max_sum_from_right_by[N - 1] = S[N - 1], min_sum_from_right_by[N - 1] = S[N - 1];
max_csum = S[N - 1], min_csum = S[N - 1];
for (uint32_t i = N - 2; i != UINT32_MAX; --i)
{
S[i] = S[i + 1] + A[i];
max_sum_from_right_by[i] = max(max_sum_from_right_by[i + 1], S[i] - min_csum);
min_sum_from_right_by[i] = min(min_sum_from_right_by[i + 1], S[i] - max_csum);
chmax(max_csum, S[i]), chmin(min_csum, S[i]);
}
int64_t ans = INT64_MIN;
for (uint32_t i = 1; i != N; ++i)
chmax(ans, max(static_cast<int64_t>(max_sum_from_left_by[i - 1]) * max_sum_from_right_by[i], static_cast<int64_t>(min_sum_from_left_by[i - 1]) * min_sum_from_right_by[i]));
return ans;
}
int main()
{
cin.tie(nullptr);
ios::sync_with_stdio(false);
uint32_t N, i;
cin >> N;
vector<int32_t> A(N);
for (i = 0; i != N; ++i)
cin >> A[i];
cout << solve(N, A) << '\n';
return 0;
}