제출 #628047

#제출 시각아이디문제언어결과실행 시간메모리
628047ShinBigger segments (IZhO19_segments)C++14
37 / 100
222 ms55344 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair

using namespace std;

const int N = 3e3 + 7;
int n;
int a[N];
long long pre[N];
int dp[N][N];
int mx[N][N];

signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i ++) {
    cin >> a[i];
    pre[i] = pre[i - 1] + a[i];
  }

  auto get = [&](int l, int r) -> long long {
    return pre[r] - pre[l - 1];
  };

  for (int i = 1; i <= n; i ++) {
    long long s = 0;
    for (int j = i; j > 0; j --) {
      s += a[j];
      mx[i][j] = mx[i][j + 1];
      if (j == 1) {
        dp[i][j] = 1;
        mx[i][j] = max(1, mx[i][j + 1]);
        continue;
      }
      int lo = 1, hi = j - 1;
      while (lo < hi) {
        int mid = (lo + hi) >> 1;
        if (get(mid, j - 1) <= s) {
          hi = mid;
        } else {
          lo = mid + 1;
        }
      }
      if (get(lo, j - 1) > s) {
        continue;
      }
      if (mx[j - 1][lo] > 0) {
        dp[i][j] = max(dp[i][j], mx[j - 1][lo] + 1);
      }
      mx[i][j] = max(dp[i][j], mx[i][j]);
    }
  }
  cout << mx[n][1];
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...