제출 #1294856

#제출 시각아이디문제언어결과실행 시간메모리
1294856azamuraiBigger segments (IZhO19_segments)C++20
0 / 100
1 ms332 KiB
#include <bits/stdc++.h>

#define int long long
#define ll long long
#define mp make_pair
#define fi first 
#define se second 
#define Sz(x) (int)x.size()

using namespace std;

const int N = 3005;
int n, a[N], dp[N][N], pref[N], suf[N][N];

void solve() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		pref[i] = pref[i - 1] + a[i];
	}	
	for (int i = 1; i <= n; i++) {
		dp[i][0] = 1;
	}
	for (int i = 2; i <= n; i++) {
		for (int j = 1; j < i; j++) {
			int posR = i;
			int posL = j + 1;
			int sum = pref[posR] - pref[posL - 1];
			int l = 0, r = j - 1, best = -1;
			while (l <= r) {
				int mid = (l + r) / 2;
				if ((pref[j] - pref[mid]) > sum) l = mid + 1;
				else {
					r = mid - 1;
					best = mid;
				}
			}
			if (best == -1) continue;
			l = best, r = j - 1, best = -1;
			while (l <= r) {
				int mid = (l + r) / 2;
				if (suf[j][mid] == 0) r = mid - 1;
				else {
					l = mid + 1;
					best = mid;
				}
			}
			if (best != -1) dp[i][j] = dp[j][best] + 1;
		}
		for (int j = i - 1; j >= 0; j--) {
			suf[i][j] = max(suf[i][j + 1], dp[i][j]);
		}
	}
	int ans = 0;
	for (int i = 0; i < n; i++) {
		ans = max(ans, dp[n][i]);
	}
	cout << ans;
}

signed main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	int tt = 1;
	// cin >> tt;
	while (tt--) {
		solve();
		cout << '\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...