Submission #409148

#TimeUsernameProblemLanguageResultExecution timeMemory
4091488e7Bigger segments (IZhO19_segments)C++14
13 / 100
2 ms2380 KiB
//Challenge: Accepted #include <iostream> #include <vector> #include <algorithm> #include <utility> #include <stack> #include <set> #define ll long long #define maxn 3005 #define mod 1000000007 #define pii pair<int, int> #define ff first #define ss second #define io ios_base::sync_with_stdio(0);cin.tie(0); using namespace std; ll a[maxn], pref[maxn]; ll dp[maxn][maxn]; /* int solve(int n) { for (int i = 0;i < n;i++) { for (int j = 0;j < n;j++) dp[i][j] = 0; } for (int i = 0;i < n;i++) { for (int j = 0;j <= i;j++) { dp[i][j] = -(1<<30); if (j == 0) { dp[i][j] = 1; } else { for (int k = j - 1;k >= 0;k--) { if (pref[i] - pref[j - 1] >= pref[j - 1] - (k ? pref[k - 1] :0)) { dp[i][j] = max(dp[i][j], dp[j - 1][k] + 1); } } } } } int ret = 0; for (int i = 0;i < n;i++) ret = max(ret, dp[n - 1][i]); return ret; } */ int solve2(int n) { for (int i = 0;i < n;i++) dp[i][0] = pref[i]; int ret = 1; int st = 0; for (int j = 1;j < n;j++) { int k = st; for (int i = st;i < n;i++) { dp[i][j] = 1LL<<60; int f = 0; while (k < n && pref[i] >= pref[k] + dp[k][j - 1]) f = 1, k++; if (f) k--; if (pref[i] >= pref[k] + dp[k][j - 1]){ dp[i][j] = pref[i] - pref[k]; } else { st++; } } if (st < n) { ret++; } else { break; } } return ret; } signed main() { io int n; cin >> n; for (int i = 0;i < n;i++) { cin >> a[i]; pref[i] = a[i] + (i ? pref[i - 1] : 0); } cout << solve2(n) << endl; } /* 4 2 3 1 7 5 6 2 3 9 13 3 3 1 2 */
#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...