Submission #172179

#TimeUsernameProblemLanguageResultExecution timeMemory
172179RafaelSusSplit the sequence (APIO14_sequence)C++14
11 / 100
167 ms18192 KiB
#include <bits/stdc++.h> using namespace std; const int N = 2e5 + 5; typedef long long ll; const ll inf=1e15; #define pb push_back const int INF=(0x3f3f3f3f); const int maxn=1e2; ll dp[maxn][maxn][maxn]; pair<int,int> rec[maxn][maxn][maxn]; int a[maxn]; ll pref[maxn]; int n,k; ll solve(int left,int right,int key){ if(left==right)return 0ll; if(dp[left][right][key]!=-1)return dp[left][right][key]; ll sumTotal=pref[right]-pref[left]+a[left]; ll sumLeft=0ll,sumRight=0ll; ll res=0; int splitPoint=-1; int splitKey=-1; for(int i=left;i<right;i++){ sumLeft+=a[i]; sumRight=sumTotal-sumLeft; for(int j=0;j<key;j++){ int k2=key-j-1; ll splitCost=sumLeft*sumRight; ll l=solve(left,i,j); ll r=solve(i+1,right,k2); ll curRes=l+r+splitCost; if(res<curRes){ res=curRes; splitPoint=i; splitKey=j; } //res=max(res,curRes); } } rec[left][right][key]=make_pair(splitPoint,splitKey); return dp[left][right][key]=res; } vector<int>ans; void getAnsw(int l,int r,int key){ if(l==r||key<=0)return; ans.pb(rec[l][r][key].first); //cerr<<l<<' '<<r<<' '<<key<<' '<<rec[l][r][key].first<<' '<<key<<'\n'; getAnsw(l,rec[l][r][key].first,rec[l][r][key].second); getAnsw(rec[l][r][key].first+1,r,key-rec[l][r][key].second-1); } int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>n>>k; for(int i=1;i<=n;i++){ cin>>a[i]; if(i>1)pref[i]=pref[i-1]+a[i]; else pref[i]=a[i]; } memset(dp,-1,sizeof dp); ll answ=solve(1,n,k); getAnsw(1,n,k); cout<<answ<<'\n'; for(auto x:ans) cout<<x<<' '; 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...