제출 #370589

#제출 시각아이디문제언어결과실행 시간메모리
370589SeanliuBigger segments (IZhO19_segments)C++17
0 / 100
188 ms262148 KiB
#include <iostream>
#include <utility>
#include <algorithm>
#include <deque>
#define pii pair<int,int> 
#define F first
#define S second
#define int long long int
using namespace std;

const int maxN = 5e5 + 326;
int N, arr[maxN];

deque<pii> dandiao[maxN];

signed main(){
	cin >> N;
	for(int i = 1; i <= N; i++){
		cin >> arr[i];
		arr[i] += arr[i - 1];
	}
	dandiao[0].push_back({0, 0});
	int ans = 0;
	for(int i = 1; i <= N; i++){
		deque<pii> tmp = deque<pii>();
		//cout << "i = " << i << endl;
		for(int j = 0; j < i; j++){
			auto p = upper_bound(dandiao[j].begin(), dandiao[j].end(), pii{arr[i] - arr[j], maxN});
			//cout << "Found: " << p->F << " " << p->S << endl;
			if(p == dandiao[j].begin() && p->F > arr[i] - arr[j]) continue;
			if(p->F > arr[i] - arr[j]) --p;
			tmp.emplace_back(arr[i] - arr[j], p->S + 1);
			//cout << "j = " << j << ", ans = " << p->S + 1 << endl;
			ans = max(ans, p->S + 1);
		}
		sort(tmp.begin(), tmp.end());
		for(auto [s, x] : tmp){
			if(!dandiao[i].size() || dandiao[i].back().S < x) dandiao[i].emplace_back(s, x);
		}
	}
	cout << ans << endl;
}
#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...