Submission #1088347

#TimeUsernameProblemLanguageResultExecution timeMemory
1088347NurislamSplit the sequence (APIO14_sequence)C++17
100 / 100
777 ms87364 KiB
#include<bits/stdc++.h> using namespace std; using i64 = long long; //#define int i64 #define vi vector<int> #define vvi vector<vi> #define vb vector<bool> #define pii pair<int, int> #define fi first #define se second #define sz(x) (int)(x).size() constexpr long double EPS = 1e-12; struct Line{ i64 m, c, i; Line(i64 _m, i64 _c, int _i) : m(_m), c(_c), i(_i) {} inline i64 calc(int x){ return m * x + c; } inline long double x_int(Line &other){ return (long double)(c - other.c) / (other.m - m + EPS); } }; signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n, k; cin >> n >> k; vi a(n + 1); for(int i = 1; i <= n; i++){ cin >> a[i]; a[i] += a[i - 1]; } vector<vector<i64>> dp(2, vector<i64>(n + 1)); vvi from(n + 1, vi(k + 2)); for(int j = 1; j < k + 1; j++){ deque<Line> dq; dq.emplace_front(0, 0, 0); for(int i = 1; i <= n; i++){ i64 ps = a[n] - a[i]; while(sz(dq) >= 2 && dq.back().calc(ps) <= dq[sz(dq) - 2].calc(ps)){ dq.pop_back(); } dp[1][i] = dq.back().calc(ps) + a[i] * ps; from[i][j] = dq.back().i; Line cur = {-a[i], dp[0][i], i}; while(sz(dq) >= 2 && cur.x_int(dq[0]) > dq[0].x_int(dq[1])){ dq.pop_front(); } dq.emplace_front(cur); } dp[0] = dp[1]; } pair<i64, int> ans{-1, 0}; for(int i = 1; i < n; ++i) { ans = max(ans, {dp[0][i], i}); } cout << ans.fi << "\n"; vi ind; for(int i = k, idx = ans.se; i >= 1; i--){ ind.emplace_back(idx); idx = from[idx][i]; } for(int i = sz(ind) - 1; i >= 0; i--){ cout << ind[i] << " "; } cout << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...