제출 #169610

#제출 시각아이디문제언어결과실행 시간메모리
169610apostoldaniel854Bigger segments (IZhO19_segments)C++14
13 / 100
4 ms2808 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5; int a[1 + N]; ll sum[1 + N]; pair <int, ll> dp[1 + N]; vector <pair <ll, int>> s[1 + N]; #define pb push_back int main () { ios::sync_with_stdio (false); cin.tie (0); cout.tie (0); int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; sum[i] = sum[i - 1] + a[i]; } for (int i = 1; i <= n; i++) { int l = 1, r = i; int best = 0; while (l <= r) { int mid = (l + r) / 2; bool ok = false; if (s[mid].size ()) { auto x = s[mid][0]; if (x.first <= sum[i] - sum[x.second]) ok = true; } if (ok) l = mid + 1, best = mid; else r = mid - 1; } if (best == 0) { dp[i] = {1, sum[i]}; } else { l = 0, r = s[best].size () - 1; ll this_sum = 0; while (l <= r) { int mid = (l + r) / 2; auto x = s[best][mid]; if (x.first <= sum[i] - sum[x.second]) { l = mid + 1; this_sum = sum[i] - sum[x.second]; } else r = mid - 1; } dp[i] = {best + 1, this_sum}; } s[dp[i].first].pb ({dp[i].second, i}); } 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...