Submission #1138520

#TimeUsernameProblemLanguageResultExecution timeMemory
1138520anmattroi수열 (APIO14_sequence)C++17
0 / 100
0 ms320 KiB
#include <bits/stdc++.h> #define maxn 100005 using namespace std; struct line { int a; int64_t b; line() {} line(int _a, int64_t _b) : a(_a), b(_b) {} long double intersectX(const line &other) const { return (long double) (b-other.b) / (other.a-a); } }; int64_t f(line x, int y) { return 1LL * x.a * y + x.b; } int n, k; int a[maxn], s[maxn]; int64_t dp[maxn][205]; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cin >> n >> k; for (int i = 1; i <= n; i++) { cin >> a[i]; s[i] = s[i-1] + a[i]; } ++k; for (int i = 1; i <= n; i++) dp[i][0] = LLONG_MIN; for (int c = 1; c <= k; c++) { deque<line> dq; dq.push_back({0, 0}); for (int i = 1; i <= n; i++) { while (dq.size() >= 2 && f(dq[0], s[i]) <= f(dq[1], s[i])) dq.pop_front(); dp[i][c] = f(dq[0], s[i]); if (dp[i][c-1] == LLONG_MIN) continue; line cur = line(s[i], dp[i][c-1] - 1LL * s[i] * s[i]); if (dq.back().a == cur.a) { if (dq.back().b >= cur.b) continue; dq.pop_back(); } while (dq.size() >= 2 && dq.back().intersectX(cur) <= dq.back().intersectX(dq[dq.size()-2])) dq.pop_back(); dq.push_back(cur); } } cout << dp[n][k]; }
#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...