제출 #1266114

#제출 시각아이디문제언어결과실행 시간메모리
1266114rayan_bdBigger segments (IZhO19_segments)C++20
13 / 100
0 ms328 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int mxN = 5e5 + 100; int a[mxN], pref[mxN]; pair<int, int> dp[mxN]; signed main(){ ios_base::sync_with_stdio(0); cin.tie(nullptr); cout.tie(nullptr); int n; cin >> n; pref[0] = 0; vector<int> a(n + 1, 0), pref(n + 5, 0); for(int i = 1; i <= n; ++i){ dp[i] = {-1, -1}; } dp[0] = {0, 0}; for(int i = 1; i <= n; ++i){ cin >> a[i]; pref[i] = pref[i - 1] + a[i]; } auto query = [&](int l, int r){ if(l == 0) return pref[r]; return pref[r] - pref[l - 1]; }; auto _mrg = [&](int i, int j){ if(dp[i].first == dp[j].first + 1) dp[i] = min(dp[i], {dp[j].first + 1, query(j + 1, i)}); else dp[i] = max(dp[i], {dp[j].first + 1, query(j + 1, i)}); }; for(int i = 1; i <= n; ++i){ dp[i] = dp[i - 1]; dp[i].second += a[i]; int st = 1, en = i, best = -1; while(st <= en){ int mid = st + (en - st) / 2; if(dp[mid - 1].second <= query(mid, i)){ best = mid - 1; st = mid + 1; }else{ en = mid - 1; } } if(best > -1) _mrg(i, best); } cout << dp[n].first << "\n"; 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...