제출 #536683

#제출 시각아이디문제언어결과실행 시간메모리
536683blueBigger segments (IZhO19_segments)C++17
100 / 100
201 ms45340 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;

using ll = long long;
using pll = pair<ll, ll>;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int N;
	cin >> N;

	ll Asum[1+N];
	Asum[0] = 0;
	for(int i = 1; i <= N; i++)
	{
		cin >> Asum[i];
		Asum[i] += Asum[i-1];
	}

	pll DP[1+N];
	DP[0] = {0, 0};

	set<pll> tbv;

	pll currbest{0, 0};

	for(int i = 1; i <= N; i++)
	{
		// cerr << "\n\n\ni = " << i << '\n';
		tbv.insert({DP[i-1].second + Asum[i-1], i-1});
		// cerr << "tbv insert " << DP[i-1].second + Asum[i-1] << ' ' << i-1 << '\n';

		// cerr << tbv.begin()->first << '\n';

		while(!tbv.empty() && tbv.begin()->first <= Asum[i])
		{
			currbest = max(currbest, {DP[tbv.begin()->second].first, tbv.begin()->second});
			// cerr << "tbv erase " << tbv.begin()->first << ' ' << tbv.begin()->second << '\n';
			tbv.erase(tbv.begin());
		}

		DP[i] = {currbest.first + 1, Asum[i] - Asum[currbest.second]};

		// cerr << i << " : " << DP[i].first << ' ' << DP[i].second << '\n';
	}

	cout << DP[N].first << '\n';
}
#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...