結果

問題 No.3129 Multiple of Twin Subarray
ユーザー SnowBeenDiding
提出日時 2025-04-25 22:04:07
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 44 ms / 2,000 ms
コード長 2,579 bytes
コンパイル時間 6,321 ms
コンパイル使用メモリ 333,908 KB
実行使用メモリ 18,980 KB
最終ジャッジ日時 2025-04-25 22:04:37
合計ジャッジ時間 8,592 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 46
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <atcoder/all>
#include <bits/stdc++.h>
#define rep(i, a, b) for (ll i = (ll)(a); i < (ll)(b); i++)
using namespace atcoder;
using namespace std;

typedef long long ll;

struct CumulativeSum {
    vector<ll> a;
    vector<ll> max_suffix, min_suffix;
    vector<ll> max_prefix, min_prefix;

    CumulativeSum(const vector<ll> &a_) : a(a_) {
        int n = a.size();
        max_suffix.resize(n);
        min_suffix.resize(n);
        max_prefix.resize(n);
        min_prefix.resize(n);
        if (n == 0)
            return;

        max_suffix[0] = a[0];
        min_suffix[0] = a[0];
        for (int i = 1; i < n; ++i) {
            max_suffix[i] = max(a[i], a[i] + max_suffix[i - 1]);
            min_suffix[i] = min(a[i], a[i] + min_suffix[i - 1]);
        }

        max_prefix[n - 1] = a[n - 1];
        min_prefix[n - 1] = a[n - 1];
        for (int i = n - 2; i >= 0; --i) {
            max_prefix[i] = max(a[i], a[i] + max_prefix[i + 1]);
            min_prefix[i] = min(a[i], a[i] + min_prefix[i + 1]);
        }
    }

    ll left_max(int i) {
        assert(i >= 0 && i < (int)max_suffix.size());
        return max_suffix[i];
    }

    ll left_min(int i) {
        assert(i >= 0 && i < (int)min_suffix.size());
        return min_suffix[i];
    }

    ll max_right(int i) {
        assert(i >= 0 && i < (int)max_prefix.size());
        return max_prefix[i];
    }

    ll min_right(int i) {
        assert(i >= 0 && i < (int)min_prefix.size());
        return min_prefix[i];
    }
};

template <typename T, typename S> bool chmax(T &a, S b) {
    if (a < b) {
        a = b;
        return 1;
    }
    return 0;
}

void solve() {
    int n;
    cin >> n;
    vector<ll> a(n);
    rep(i, 0, n) cin >> a[i];
    CumulativeSum cs(a);
    ll ans = -2e18;
    vector<ll> lmn, lmx, rmn, rmx;
    rep(i, 0, n) {
        lmn.push_back(cs.left_min(i));
        lmx.push_back(cs.left_max(i));
        rmn.push_back(cs.min_right(i));
        rmx.push_back(cs.max_right(i));
    }
    rep(i, 1, n) {
        lmn[i] = min(lmn[i], lmn[i - 1]);
        lmx[i] = max(lmx[i], lmx[i - 1]);
    }
    for (int i = n - 2; i >= 0; --i) {
        rmn[i] = min(rmn[i], rmn[i + 1]);
        rmx[i] = max(rmx[i], rmx[i + 1]);
    }
    rep(i, 0, n - 1) {
        chmax(ans, lmn[i] * rmx[i + 1]);
        chmax(ans, lmx[i] * rmn[i + 1]);
        chmax(ans, lmn[i] * rmn[i + 1]);
        chmax(ans, lmx[i] * rmx[i + 1]);
    }
    cout << ans << endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    while (t--) {
        solve();
    }
}
0