제출 #1271295

#제출 시각아이디문제언어결과실행 시간메모리
1271295bbldrizzy수열 (APIO14_sequence)C++20
71 / 100
90 ms196608 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; const ll NEG = numeric_limits<ll>::min()/4; 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 = NEG; ll best = -1; ll ub = min(mid-1, r); // forbid k == mid (no empty segment) if (l <= ub) { for (ll k = l; k <= ub; k++) { if (dp[k][id-1] == NEG) continue; ll v = dp[k][id-1] + pref[k+1]*(pref[mid+1]-pref[k+1]); if (v > mx) { best = k; mx = v; } } } dp[mid][id] = mx; pr[mid][id] = best; solve(id, i, mid-1, l, (best==-1? l : best)); solve(id, mid+1, j, (best==-1? mid : 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, vector<ll>(k+1, NEG)); pr.assign(n, vector<ll>(k+1, -1)); pref.assign(n+1, 0); for (int i = 0; i < n; i++) pref[i+1] = pref[i] + v[i]; for (int i = 0; i < n; i++) dp[i][0] = 0; 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; vector<ll> parts; for (int i = 0; i < k; i++) { if (cur < 0) break; ll idx = pr[cur][k-i]; if (idx == -1) break; parts.push_back(idx+1); cur = idx; } reverse(parts.begin(), parts.end()); string s1 = ""; for (int i = 0; i < (int)parts.size(); i++) { if (i) s1 += " "; s1 += to_string(parts[i]); } 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...