Submission #1039334

#TimeUsernameProblemLanguageResultExecution timeMemory
1039334fimhSplit the sequence (APIO14_sequence)C++14
100 / 100
918 ms81576 KiB
#include <bits/stdc++.h> using ll = long long; // #define int long long #define fi first #define pll pair<ll, ll> #define se second #define isz(x) (int)(x).size() #define sq(x) (ll)(x)*(x) using namespace std; const ll inf = 1e18; const int mod = 1e9 + 7; const int maxn = 1e5 + 5; const int block = 500; int mid; ll best, cost; int ps[maxn], trace[maxn][201]; ll dp[maxn][2]; void compute(int j, int l, int r, int optl, int optr){ if (l > r) return; mid = (l + r) >> 1; best = inf; for (int i = optl; i <= min(mid, optr); ++i){ cost = sq(ps[mid] - ps[i - 1]); if (best >= dp[i - 1][0] + cost){ best = dp[i - 1][0] + cost; trace[mid][j] = i; } } dp[mid][1] = best; compute(j, l, mid - 1, optl, trace[mid][j]); compute(j, mid + 1, r, trace[mid][j], optr); } void test(){ int n, k; cin >> n >> k; for (int i = 1; i <= n; ++i){ cin >> ps[i]; ps[i] += ps[i - 1]; dp[i][0] = sq(ps[i]); } for (int j = 2; j <= k + 1; ++j){ compute(j, 1, n, 1, n); for (int i = 1; i <= n; ++i) dp[i][0] = dp[i][1]; } ll ans = (sq(ps[n]) - dp[n][0]) / 2; cout << ans << "\n"; vector<int> path; int y = k + 1, x = trace[n][y]; while (y > 1){ path.push_back(x - 1); --y; x = trace[x - 1][y]; } reverse(path.begin(), path.end()); for (int i : path) cout << i << " "; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); test(); }
#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...