Submission #707743

#TimeUsernameProblemLanguageResultExecution timeMemory
707743emptypringlescanBigger segments (IZhO19_segments)C++17
100 / 100
103 ms29120 KiB
#include <bits/stdc++.h>
using namespace std;
int32_t main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n;
	cin >> n;
	long long arr[n],pref[n+1];
	for(int i=0; i<n; i++) cin >> arr[i];
	pref[0]=0;
	for(int i=0; i<n; i++){
		pref[i+1]=pref[i]+arr[i];
	}
	pair<int,long long> dp[n+1];
	dp[0]={0,0};
	vector<pair<int,long long> > mono;
	mono.push_back({0,0});
	for(int i=1; i<=n; i++){
		int lo=0,hi=mono.size()-1,mid;
		while(lo<hi){
			mid=(lo+hi+1LL)/2;
			if(mono[mid].second<=pref[i]) lo=mid;
			else hi=mid-1;
		}
		assert(mono[lo].second<=pref[i]);
		dp[i]={dp[mono[lo].first].first+1LL,pref[i]-pref[mono[lo].first]};
		while(!mono.empty()&&mono.back().second>=dp[i].second+pref[i]){
			mono.pop_back();
		}
		mono.push_back({i,dp[i].second+pref[i]});
	}
	cout << dp[n].first;
	return 0;
}
#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...