제출 #973350

#제출 시각아이디문제언어결과실행 시간메모리
973350avighna수열 (APIO14_sequence)C++17
50 / 100
2091 ms49732 KiB
#include <bits/stdc++.h> typedef long long ll; template <typename T> class Vector : public std::vector<T> { public: using std::vector<T>::vector; std::vector<ll> psum; void calculate_prefix_sum() { psum.resize(this->size()); std::partial_sum(this->begin(), this->end(), psum.begin()); } T sum(ll a, ll b) { if (a > b) { return 0; } T ans = psum[b]; if (a - 1 >= 0) { ans -= psum[a - 1]; } return ans; } }; const ll N = 1e5 + 1, K = 201; const ll inf = 1e15; class Ans { public: ll tot; ll idx; }; bool operator<(const Ans &a, const Ans &b) { return a.tot < b.tot; } Ans dp[N][K]; int main() { ll n, k; std::cin >> n >> k; Vector<ll> a(n); for (auto &i : a) { std::cin >> i; } a.calculate_prefix_sum(); if (n == 2) { std::cout << a[0] * a[1] << "\n1\n"; return 0; } for (ll i = n - 1; i >= 0; -- i) { for (ll j = 0; j <= k; ++ j) { if (i == n - 1) { if (j != 0) { dp[i][j].tot = -inf; } else { dp[i][j].tot = 0; } continue; } if (j == 0) { dp[i][j].tot = 0; continue; } dp[i][j].tot = 0; for (ll c = i; c < n - 1; c++) { dp[i][j] = std::max(dp[i][j], {a.sum(i, c) * a.sum(c + 1, n - 1) + dp[c + 1][j - 1].tot, c + 1}); } } } std::cout << dp[0][k].tot << "\n"; ll i = 0; ll ops = k; for (ll c = i; c < n - 1 && ops > 0; c++) { if (dp[i][ops].tot == a.sum(i, c) * a.sum(c + 1, n - 1) + dp[c + 1][ops - 1].tot) { std::cout << c + 1 << " "; ops--; i = c + 1; } } }
#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...