제출 #7611

#제출 시각아이디문제언어결과실행 시간메모리
7611hongjun7수열 (APIO14_sequence)C++98
100 / 100
568 ms84024 KiB
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define MK 202
#define MN 100002
int N, K, i, j, k, X[MN], _k = 1, best[MK][MN], s[MN], b;
long long d[2][MN], f[MN], S[MN];
bool ok(int z) {
	int x = s[b-1], y = s[b];
	return (f[y]-f[x])*(S[y]-S[z]) >= (f[z]-f[y]) *(S[x]-S[y]);
}
int main() {
	int x;
	scanf("%d%d",&N,&K);
	for (i = 1; i <= N; i++) {
		scanf("%d", &X[i]);
		S[i] = S[i-1] + X[i];
	}
	for (i = 0; i <= N; i++) d[0][i] = -1;
	for (k = 2; k <= K+1; k++) {
		_k = k&1;
		for (i = 0; i <= N; i++) d[_k][i] = 0;
		b = -1; x = 1;
		s[++b] = 0; s[++b] = 1;
		for (i = 0; i <= N; i++) f[i] = d[!(_k)][i]-S[i]*S[i];
		for (i = 2; i <= N; i++) {
			if (x > b) x = b;
			while (x < b && (f[s[x]]-f[s[x+1]]) <= (S[s[x+1]] - S[s[x]])*S[i]) x++;
			d[_k][i] = f[s[x]]+S[s[x]]*S[i];
			best[k][i] = s[x];
			while (b >= x && ok(i)) b--;
			s[++b] = i;
		}
	}
	printf("%lld\n",d[_k][N]);
	x = N;
	vector <int> res;
	for (i = K+1; i > 1; i--) {
		x = best[i][x];
		res.push_back(x);
	}
	reverse(res.begin(), res.end());
	for (i = 0; i < res.size(); i++) printf("%d ",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...