Submission #342615

#TimeUsernameProblemLanguageResultExecution timeMemory
342615SeDunionBigger segments (IZhO19_segments)C++17
100 / 100
373 ms39572 KiB
#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 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...