Submission #737825

#TimeUsernameProblemLanguageResultExecution timeMemory
737825amirhoseinfar1385Split the sequence (APIO14_sequence)C++17
50 / 100
2072 ms32596 KiB
    #include<bits/stdc++.h>
    using namespace std;
     
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	int n,k;
    	cin>>n>>k;
    	vector<long long>all(n+1);
    	for(int i=1;i<=n;i++){
    		cin>>all[i];
    	}
    	vector<vector<long long>>dp(n+3,vector<long long>(k+1));
    	vector<vector<long long>>dpa(n+3,vector<long long>(k+1));
    	vector<long long>ps(n+3),suf(n+3);
    	for(int i=1;i<=n;i++){
    		ps[i]=ps[i-1]+all[i];
    	}
    	for(int i=n;i>=1;i--){
    		suf[i]=all[i]+suf[i+1];
    	}
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=0;j<=k;j++){
    			if(j==0){
    				dp[i][j]=0;
    				continue;
    			}
    			if(j==1){
    				dp[i][j]=ps[i]*suf[i+1];
    				dpa[i][j]=-1;
    				continue;
    			}
    			for(int h=1;h<i;h++){
    				long long fake=dp[h][j-1]+(ps[i]-ps[h])*suf[i+1];
    				if(fake>dp[i][j]){
    					dp[i][j]=fake;
    					dpa[i][j]=h;
    				}
    			}
    			if(i>1&&dpa[i][j]<dpa[i-1][j]){
    				assert(0);
    			}
    		}
    	}
    	long long maxa=-1,w=0;
    	for(int i=1;i<=n;i++){
    		if(dp[i][k]>maxa){
    			w=i;
    			maxa=dp[i][k];
    		}	
    	}
    	cout<<maxa<<"\n";
    	int now=k;
    	vector<int>res;
    	while(now>0){
    		res.push_back(w);
    		w=dpa[w][now];
    		now--;
    	}
    	reverse(res.begin(),res.end());
    	for(auto x:res){
    		cout<<x<<" ";
    	}
    	cout<<endl;
    }
#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...