This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define int long long
const int maxn = 5e5 + 69;
const int inf = 1e18;
int n, a[maxn], p[maxn], ptr[maxn];
vector<pair<int, int>> g[maxn];
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int tt = 1;
//cin >> tt;
while (tt--) {
cin >> n;
for (int i = 1;i <= n;i++) {
cin >> a[i];
ptr[i] = -1;
}
for (int i = 1;i <= n;i++)
p[i] = p[i - 1] + a[i];
g[0].push_back({0, 0});
int ans = 0;
auto check = [&](int x, int i) {
if (g[x - 1].empty())
return -1ll;
int t = ptr[x - 1], k = -1;
if (t != -1)
k = p[i] - p[g[x - 1][t].f];
while (t + 1 < (int)g[x - 1].size() && p[i] - p[g[x - 1][t + 1].f] >= g[x - 1][t + 1].s) {
k = p[i] - p[g[x - 1][t + 1].f];
t++;
}
ptr[x - 1] = t;
return k;
};
for (int i = 1;i <= n;i++) {
int l = 1, r = i, id = 0, sm = 0;
while (l <= r) {
int mid = (l + r) / 2;
int gas = check(mid, i);
if (gas != -1) {
id = mid;
sm = gas;
l = mid + 1;
}
else
r = mid - 1;
}
ans = max(ans, id);
g[id].push_back({i, sm});
}
cout << ans;
}
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... |