Submission #490122

#TimeUsernameProblemLanguageResultExecution timeMemory
490122retsigerBigger segments (IZhO19_segments)C++14
100 / 100
78 ms16024 KiB
#include<bits/stdc++.h>
#define bug(x) cerr<<__LINE__<<": "<<#x<<" = "<<x<<'\n'
#define x first
#define y second

using namespace std;
using ll = long long;

const int maxn = 500100, INF = 1e9;

typedef pair<int, ll> ii;

int N, A[maxn];
ll S[maxn];

ii dp[maxn];

void maxx(ii &a, ii b) {
  if (a.x < b.x) {
    a = b;
  } else if (a.x == b.x) {
    if (a.y > b.y) a = b;
  }
  return;
}

int main() {
  ios::sync_with_stdio(0); cin.tie(0);
//  freopen("cc.inp", "r", stdin);
//  freopen("cc.out", "w", stdout);
  cin >> N;
  for (int i = 1; i <= N; ++i)
    cin >> A[i], S[i] = A[i] + S[i - 1];
  dp[1] = {1, A[1]};
  for (int i = 1; i <= N; ++i) {
    ll sum = dp[i].y;
    int lo = i + 1, hi = N, p = -1;
    while (lo <= hi) {
      int mi = (lo + hi) >> 1;
      if (S[mi] - S[i] >= sum) {
        p = mi;
        hi = mi - 1;
      } else
        lo = mi + 1;
    }
    if (p != -1) {
      maxx(dp[p], {dp[i].x + 1, S[p] - S[i]});
    }
    maxx(dp[i + 1], {dp[i].x, dp[i].y + A[i + 1]});
  }
  cout << dp[N].x << '\n';
  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...