Submission #1271293

#TimeUsernameProblemLanguageResultExecution timeMemory
1271293bbldrizzySplit the sequence (APIO14_sequence)C++20
11 / 100
0 ms328 KiB
#include <bits/stdc++.h> #include <ios> #include <iostream> using namespace std; using ll = long long; using P = pair<int, int>; #define f first #define s second const int MOD = 1e9+7; const ll MX = 4*1e18; vector<ll> pref; vector<vector<ll>> dp; vector<vector<ll>> pr; void solve(ll id, ll i, ll j, ll l, ll r) { if (i > j) return; ll mid = (i+j)/2; ll mx = 0; ll best = l; for (ll k = l; k <= min(mid, r); k++) { ll v = dp[k][id-1] + pref[k+1]*(pref[mid+1]-pref[k+1]); // ll v = dp[k-1][id-1] + cost[k][mid]; if (v > mx) { best = k; mx = v; } } dp[mid][id] = mx; pr[mid][id] = best; // cout << "mid, best, mn: " << mid << ", " << best << ", " << mn << "\n"; // cout << "dp[best][id-1]: " << dp[best][id-1] << "\n"; solve(id, i, mid-1, l, best); solve(id, mid+1, j, best, r); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); ll n, k; cin >> n >> k; vector<ll> v(n); for (auto &x: v) cin >> x; dp.assign(n+1, vector<ll>(k+2)); pr.assign(n+1, vector<ll>(k+2)); pref.assign(n+1, 0); for (int i = 0; i < n; i++) { pref[i+1] = pref[i] + v[i]; } for (int i = 1; i <= k; i++) { solve(i, 0, n-1, 0, n-1); } cout << dp[n-1][k] << "\n"; ll cur = n-1; string s1 = ""; for (int i = 0; i < k; i++) { // cout << pr[cur][k-i]+1 << " "; s1 += to_string(pr[cur][k-i]+1); if (i < k-1) s1 += " "; cur = pr[cur][k-i]; } reverse(s1.begin(), s1.end()); cout << s1; }
#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...