제출 #570600

#제출 시각아이디문제언어결과실행 시간메모리
570600beaconmcSplit the sequence (APIO14_sequence)C++14
71 / 100
88 ms131072 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
typedef long long ll;
#define FOR(i,x,y) for(ll i=x; i<y; i++)
#define FORNEG(i,x,y) for(ll i=x; i>y; i--)

using namespace std;

ll dp[100002][202];
int ans[100002][202];
ll suff[100002];



double slope(ll a, ll b, ll j){
	if (suff[b] == suff[a]){
		if ((double)dp[a][j-1] - (double)dp[b][j-1] <= 0) return 1000000000000;
	}
	return ((double)dp[a][j-1] - (double)dp[b][j-1]) / ((double)suff[b] - (double)suff[a]);
}


int main(){

	ll n,k;
	cin >> n >> k;


	

	vector<ll> nums(n);
	FOR(i,0,n) cin >> nums[i];

	suff[n] = 0;
	suff[n-1] = nums[n-1];
	FORNEG(i,n-2,-1){
		suff[i] = suff[i+1] + nums[i];
	}



	dp[0][0] = 0;
	
	
	FOR(j,1,k+2){
		deque<ll> q;
		q.push_back(0);
		dp[0][j] = 0;
		FOR(i,1,n+1){

			//cout << q[0] << " " << q[1] << " " << slope(q[0], q[1], j) << " " << suff[i] << endl;

			while (q.size() >= 2 && slope(q[0], q[1], j) >= suff[i]){
				q.pop_front();
			}

			ll tmp = q.front();
			dp[i][j] = dp[tmp][j-1] + (suff[tmp]-suff[i])*suff[i];
			ans[i][j] = tmp;

			//cout << tmp << " " << maxpos << endl;
			//cout << endl;


			while (q.size() >=2 && slope(q[q.size()-2], q[q.size()-1], j) < slope(q[q.size()-1], i, j)){
				q.pop_back();
			}

			q.push_back(i);

		}
	}

	cout << dp[n][k+1] << "\n";

	// FOR(i,0,n+1){
	// 	FOR(j,0,k+2){
	// 		cout << dp[i][j] << " ";
	// 	}
	// 	cout << endl;
	// }

	ll sus = n;
	vector<ll> sussy;


	FOR(i,0,k){
		sus = ans[sus][k-i+1];
		cout << sus << " ";
	}




}
#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...