제출 #883689

#제출 시각아이디문제언어결과실행 시간메모리
883689OAleksaBigger segments (IZhO19_segments)C++14
13 / 100
4 ms15240 KiB
#include<bits/stdc++.h> using namespace std; #define f first #define s second #define int long long const int maxn = 5e5 + 69; const int inf = 1e18; int n, a[maxn], p[maxn], ptr[maxn]; vector<pair<int, int>> g[maxn]; signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int tt = 1; //cin >> tt; while (tt--) { cin >> n; for (int i = 1;i <= n;i++) { cin >> a[i]; ptr[i] = -1; } for (int i = 1;i <= n;i++) p[i] = p[i - 1] + a[i]; g[0].push_back({0, 0}); int ans = 0; auto check = [&](int x, int i) { if (g[x - 1].empty()) return -1ll; int t = ptr[x - 1], k = -1; if (t != -1) k = p[i] - p[g[x - 1][t].f]; while (t + 1 < (int)g[x - 1].size() && p[i] - p[g[x - 1][t + 1].f] >= g[x - 1][t + 1].s) { k = p[i] - p[g[x - 1][t + 1].f]; t++; } ptr[x - 1] = t; return k; }; for (int i = 1;i <= n;i++) { int l = 1, r = i, id = 0, sm = 0; while (l <= r) { int mid = (l + r) / 2; int gas = check(mid, i); if (gas != -1) { id = mid; sm = gas; l = mid + 1; } else r = mid - 1; } ans = max(ans, id); g[id].push_back({i, sm}); } cout << ans; } 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...