Submission #971200

#TimeUsernameProblemLanguageResultExecution timeMemory
971200kilkuwuSplit the sequence (APIO14_sequence)C++17
100 / 100
827 ms84824 KiB
#include <bits/stdc++.h> #define nl '\n' struct Line { int64_t a, b; int id; double intersect(const Line& l) const { auto nume = b - l.b; auto deno = l.a - a; return (double) nume / deno; } int64_t eval(int64_t x) const { return a * x + b; } }; struct DoubleEndedLineContainer : std::deque<Line> { void add(const Line& l) { if (empty()) { push_back(l); return; } while (size() >= 2 && at(size() - 1).intersect(at(size() - 2)) >= at(size() - 2).intersect(l)) { pop_back(); } if (back().a == l.a) { if (l.b > back().b) { back() = l; } } else { push_back(l); } } std::pair<int64_t, int> query(int64_t x) { while (size() >= 2 && at(0).intersect(at(1)) <= x) { pop_front(); } return {front().eval(x), front().id}; } }; const int mxN = 1e5 + 5, mxK = 205; int way[mxN][mxK]; int N, K; signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cin >> N >> K; std::vector<int> A(N + 1); std::vector<int64_t> pref(N + 1); for (int i = 1; i <= N; i++) { std::cin >> A[i]; pref[i] = pref[i - 1] + A[i]; } std::vector<int64_t> dp(N + 1, -1e18); std::vector<int64_t> ndp(N + 1, -1e18); dp[0] = 0; for (int j = 1; j <= K + 1; j++) { DoubleEndedLineContainer lines; lines.add({pref[0], dp[0] - pref[0] * pref[0], 0}); ndp[0] = -1e18; for (int i = 1; i <= N; i++) { auto line = lines.query(pref[i]); ndp[i] = line.first; way[i][j] = line.second; lines.add({pref[i], dp[i] - pref[i] * pref[i], i}); } std::swap(dp, ndp); } std::cout << dp[N] << nl; std::vector<int> ans; int x = N; int y = K + 1; while (x > 0 && y > 1) { ans.push_back(way[x][y]); x = way[x][y]; y--; } for (int i : ans) std::cout << i << " "; std::cout << nl; } /* 7 3 4 1 3 4 0 2 3 */
#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...