#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mxN = 5e5 + 100;
int a[mxN], pref[mxN];
pair<int, int> dp[mxN];
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(nullptr); cout.tie(nullptr);
int n;
cin >> n;
pref[0] = 0;
vector<int> a(n + 1, 0), pref(n + 5, 0);
for(int i = 1; i <= n; ++i){
dp[i] = {-1, -1};
}
dp[0] = {0, 0};
for(int i = 1; i <= n; ++i){
cin >> a[i];
pref[i] = pref[i - 1] + a[i];
}
auto query = [&](int l, int r){
if(l == 0) return pref[r];
return pref[r] - pref[l - 1];
};
auto _mrg = [&](int i, int j){
if(dp[i].first == dp[j].first + 1) dp[i] = min(dp[i], {dp[j].first + 1, query(j + 1, i)});
else dp[i] = max(dp[i], {dp[j].first + 1, query(j + 1, i)});
};
for(int i = 1; i <= n; ++i){
dp[i] = dp[i - 1];
dp[i].second += a[i];
int st = 1, en = i, best = -1;
while(st <= en){
int mid = st + (en - st) / 2;
if(dp[mid - 1].second <= query(mid, i)){
best = mid - 1;
st = mid + 1;
}else{
en = mid - 1;
}
}
if(best > -1) _mrg(i, best);
}
cout << dp[n].first << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |