This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<int,pii> pip;
#define f first
#define s second
const int maxn = 1e5+10, maxk = 210;
ll dp[maxn][2], v[maxn], suf[maxn];
int opt[maxn][maxk];
void solve(int l, int r, int optl, int optr, int k){
if(l > r) return;
int mid = (l + r) >> 1;
dp[mid][1] = 0;
for(int i=optl; i<=min(mid-1, optr); i++){
ll c = dp[i][0] + (suf[i+1] - suf[mid+1]) * suf[mid+1];
if(c >= dp[mid][1]){
dp[mid][1] = c;
opt[mid][k] = i;
}
}
solve(l, mid-1, optl, opt[mid][k], k); solve(mid+1, r, opt[mid][k], optr, k);
}
int main(){
ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
int n, k;
cin >> n >> k;
for(int i=1; i<=n; i++) cin >> v[i];
for(int i=n; i>=1; i--) suf[i] = v[i] + suf[i+1];
for(int i=1; i<n; i++) dp[i][0] = (suf[1] - suf[i+1]) * suf[i+1];
for(int i=2; i<=k; i++){
solve(1, n-1, 1, n-1, i);
for(int j=1; j<=n; j++) dp[j][0] = dp[j][1];
}
int id = 1;
for(int i=2; i<n; i++) if(dp[i][0] > dp[id][0]) id = i;
cout << dp[id][0] << "\n";
vector<int> ans;
for(int i=k; i>=1; i--){
ans.push_back(id);
id = opt[id][i];
}
for(int i=((int)ans.size())-1; i>=0; i--) cout << ans[i] << " ";
cout << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |