Submission #628047

#TimeUsernameProblemLanguageResultExecution timeMemory
628047ShinBigger segments (IZhO19_segments)C++14
37 / 100
222 ms55344 KiB
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair using namespace std; const int N = 3e3 + 7; int n; int a[N]; long long pre[N]; int dp[N][N]; int mx[N][N]; signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; i ++) { cin >> a[i]; pre[i] = pre[i - 1] + a[i]; } auto get = [&](int l, int r) -> long long { return pre[r] - pre[l - 1]; }; for (int i = 1; i <= n; i ++) { long long s = 0; for (int j = i; j > 0; j --) { s += a[j]; mx[i][j] = mx[i][j + 1]; if (j == 1) { dp[i][j] = 1; mx[i][j] = max(1, mx[i][j + 1]); continue; } int lo = 1, hi = j - 1; while (lo < hi) { int mid = (lo + hi) >> 1; if (get(mid, j - 1) <= s) { hi = mid; } else { lo = mid + 1; } } if (get(lo, j - 1) > s) { continue; } if (mx[j - 1][lo] > 0) { dp[i][j] = max(dp[i][j], mx[j - 1][lo] + 1); } mx[i][j] = max(dp[i][j], mx[i][j]); } } cout << mx[n][1]; 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...