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;
using ll = long long;
const int N = 5e5 + 55;
ll a[N], p[N];
ll sum(int l, int r) {
return p[r] - p[l - 1];
}
using pll = pair<ll,ll>;
set<pair<ll,pll>> s;
vector<set<pair<ll,pll>>::iterator> del;
void upd(ll pos, pll val) {
//cout << pos << " " << val.first << " " << val.second << " mk" << endl;;
del.clear();
auto it = s.upper_bound({pos, {-1, -1}});
if (s.size() && it != s.begin() && prev(it)->second >= val) return;
//cout << "actually added" << endl;
while (it != s.end() && it->second <= val) {
del.push_back(it);
it++;
}
for (auto it : del) {
s.erase(it);
}
s.insert({pos, val});
}
pll get(ll pos) {
//cout << pos << " sr" << endl;
auto it = s.upper_bound({pos + 1, {-1, -1}});
if (s.empty() || it == s.begin()) return {-1, -1};
//cout << prev(it)->second.first << " " << prev(it)->second.second << " fou" << endl;
return prev(it)->second;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int n;
cin >> n;
for (int i = 1 ; i <= n ; ++ i) {
cin >> a[i];
p[i] = a[i] + p[i - 1];
}
ll mx = 1;
upd(-sum(1, n), {0, 0});
for (int i = 1 ; i <= n ; ++ i) {
auto [s, j] = get(-sum(i + 1, n));
j++;
mx = max(mx, s + 1);
upd(sum(j, i) - sum(i + 1, n), {s + 1, i});
//cout << i << " " << s << " " << j << endl;
}
cout << mx;
}
# | 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... |