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...