Submission #570614

#TimeUsernameProblemLanguageResultExecution timeMemory
570614beaconmc수열 (APIO14_sequence)C++14
100 / 100
649 ms83152 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--)
#define double long double


using namespace std;

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



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

bool case1(ll a, ll b, ll i){
	return (dp[a][0] - dp[b][0]) <= (suff[b] - suff[a])*suff[i];
}


bool case2(ll a, ll b, ll i){
	return (dp[a][0] - dp[b][0]) * (suff[i] - suff[b]) <= (dp[b][0] - dp[i][0]) * (suff[b] - 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];
	}



	FOR(i,0,n+1){
		dp[i][0] = 0;
	}

	
	
	FOR(j,1,k+2){

		deque<ll> q;
		q.push_back(0);

		FOR(i,1,n+1){

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

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



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

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


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

			q.push_back(i);
		}

		FOR(i,1,n+1){
			dp[i][0] = dp[i][1];
		}


	}



	cout << dp[n][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...