結果

問題 No.3129 Multiple of Twin Subarray
ユーザー ripity
提出日時 2025-04-25 22:00:38
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 88 ms / 2,000 ms
コード長 975 bytes
コンパイル時間 3,469 ms
コンパイル使用メモリ 279,588 KB
実行使用メモリ 17,312 KB
最終ジャッジ日時 2025-04-25 22:01:09
合計ジャッジ時間 7,484 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 46
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;

using ll = long long;

pair<vector<ll>, vector<ll>> calc(vector<ll> A) {
  const int N = A.size();
  vector<ll> S(N + 1);
  for(int i = 0; i < N; i++) {
    S[i + 1] = S[i] + A[i];
  }
  ll mn = 0, mx = 0;
  vector<ll> X(N), Y(N);
  for(int i = 0; i < N; i++) {
    X[i] = S[i + 1] - mn;
    Y[i] = S[i + 1] - mx;
    if(i > 0) X[i] = max(X[i], X[i - 1]);
    if(i > 0) Y[i] = min(Y[i], Y[i - 1]);
    mn = min(mn, S[i + 1]);
    mx = max(mx, S[i + 1]);
  }
  return make_pair(X, Y);
}

int main() {
  int N;
  cin >> N;
  vector<ll> A(N);
  for(int i = 0; i < N; i++) {
    cin >> A[i];
  }
  auto [X, Y] = calc(A);
  reverse(A.begin(), A.end());
  auto [Z, W] = calc(A);
  reverse(Z.begin(), Z.end());
  reverse(W.begin(), W.end());
  ll ans = -1LL << 60;
  for(int i = 0; i < N - 1; i++) {
    // cout << X[i] << " " << Z[i + 1] << endl;
    ans = max(ans, max(X[i] * Z[i + 1], Y[i] * W[i + 1]));
  }
  cout << ans << endl;
}
0