Submission #310140

#TimeUsernameProblemLanguageResultExecution timeMemory
310140sofapudenSplit the sequence (APIO14_sequence)C++14
0 / 100
112 ms86380 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; vector<int> v(100005); vector<vector<ll>> dp(2,vector<ll>(100005)); vector<vector<int>> L(100005,vector<int>(205)); int k; void find(int l, int r, int lb, int rb, int Z){ if(l > r)return; int mid = (l+r)>>1; int pos = lb; ll ma = -1; for(int i = lb; i < min(mid,rb+1); ++i){ if(ma < 1ll * dp[0][i]+ 1ll * (v[mid]-v[i])*v[i]){ ma = 1ll * dp[0][i]+ 1ll * (v[mid]-v[i])*v[i]; pos = i; } } dp[1][mid] = ma; L[mid][Z] = pos; find(l,mid-1,lb,pos,Z); find(mid+1,r,pos,rb,Z); } int main(){ int n; cin >> n >> k; for(int i = 0; i++ < n;){ cin >> v[i]; } if(n == 2){ cout << v[1]*v[2] << "\n"; cout << 1 << "\n"; } for(int i = 0; i++ < n;){ v[i]+=v[i-1]; } for(int i = 1; i<=k; ++i){ find(1,n,1,n,i); for(int j = 1; j <= n; ++j)dp[0][j] = dp[1][j]; } ll ans = 0; int ind = 0; for(int i = 1; i <= n; ++i){ if(ans < dp[0][i]){ ind = i; ans = dp[0][i]; } } cout << ans << "\n"; while(k--){ cout << L[ind][k]+1 << " "; ind = L[ind][k]; } cout << "\n"; }
#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...