제출 #5686

#제출 시각아이디문제언어결과실행 시간메모리
5686cki86201수열 (APIO14_sequence)C++98
100 / 100
516 ms85860 KiB
#include<stdio.h>
#include<set>

typedef long long ll;
typedef std::pair<ll,ll> pl;
#define X first
#define Y second

int n, k, s[100010];
ll d[2][100010];
int b[202][100010];
int ans[202];
struct deq{
	pl p[100010];
	int w[100010];
	int f, r;
	void init(){f=r=0;}
	void push(pl x,int c){
		while(f-r>1 && (p[f-1].X - p[f-2].X) * (x.Y - p[f-1].Y) >= (x.X - p[f-1].X) * (p[f-1].Y - p[f-2].Y))--f;
		p[f] = x, w[f++] = c;
	}
	ll pop(ll x){
		while(f-r>1 && (x*p[r].X + p[r].Y) <= (x*p[r+1].X + p[r+1].Y))++r;
		return x*p[r].X + p[r].Y;
	}
	inline int prev(){return w[r];}
}Deq[2];

int main()
{
	scanf("%d%d",&n,&k);
	int i;
	for(i=1;i<=n;i++)scanf("%d",s+i);
	for(i=1;i<=n;i++)s[i] += s[i-1];
	for(int j=1;j<=k;j++){
		int t = j&1;
		Deq[t].init();
		for(i=1;i<=n;i++){
			d[t][i] = Deq[!t].pop(s[i]);
			b[j][i] = Deq[!t].prev();
			Deq[!t].push(pl(s[i], d[!t][i] - (ll)s[i]*s[i]), i);
		}
	}
	printf("%lld\n",d[k&1][n]);
	int now = n;
	for(i=k;i;i--)now = b[i][now], ans[i] = now;
	for(i=1;i<=k;i++)printf("%d ",ans[i]);
	return 0;
}
#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...