Submission #1286639

#TimeUsernameProblemLanguageResultExecution timeMemory
1286639namhhSplit the sequence (APIO14_sequence)C++20
100 / 100
644 ms83832 KiB
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define pll pair<long long,long long>
#define fi first
#define se second
const int N = 1e5+5;
int n,k,a[N],trace[N][201];
long long dp[N],pref[N],suf[N],pre[N];
struct line{
	int id;
	long long a,b;
};
bool bad(const line &l1, const line &l2, const line &l3){
    __int128 left = (__int128)(l2.b-l1.b)*(__int128)(l2.a-l3.a);
    __int128 right = (__int128)(l3.b-l2.b)*(__int128)(l1.a-l2.a);
    return left >= right;
}
signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n >> k;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		pref[i] = pref[i-1]+a[i];
	}
	for(int i = n; i >= 1; i--) suf[i] = suf[i+1]+a[i];
	for(int j = 1; j <= k; j++){
		deque<line>dq;
		dq.push_back({0,0,0});
		for(int i = 1; i <= n; i++){
			while(dq.size() >= 2 && -suf[i+1]*dq[0].a+dq[0].b <= -suf[i+1]*dq[1].a+dq[1].b) dq.pop_front();
			if(i >= j){
				if(dq.empty()) dp[i] = suf[i+1]*pref[i];
			    else{
				    dp[i] = -suf[i+1]*(dq[0].a-pref[i])+dq[0].b;
			        trace[i][j] = dq[0].id;
			    }
			}
			if(i >= j-1){
				line nw = {i,pref[i],pre[i]};
                while(dq.size() >= 2 && bad(dq[dq.size()-2],dq[dq.size()-1],nw)) dq.pop_back();
                dq.push_back(nw);
			}
		}
		for(int i = 1; i <= n; i++){
			if(i < j) pre[i] = 0;
			else pre[i] = dp[i];
		}
	}
	long long ans = -1;
	int idx;
	for(int i = k; i <= n; i++){
	    if(ans < dp[i]){
	    	ans = dp[i];
	    	idx = i;
		}
	}
	cout << ans << "\n";
	vector<int>res;
	while(k > 0){
		res.push_back(idx);
		idx = trace[idx][k];
		k--;
	}
	for(int i = res.size()-1; i >= 0; i--) cout << res[i] << " ";
}
#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...