hdu 3507 Print Article(斜率優化)

題目鏈接

http://acm.hdu.edu.cn/showproblem.php?pid=3507

關於斜率優化我理解的不太透徹,講也講不清楚。這裏只是整理一下模板,見諒見諒。

代碼

#include <bits/stdc++.h>
#define maxn 500010
#define ll long long
using namespace std;
ll n,m,c[maxn],s[maxn],q[maxn],f[maxn];
//斜率分子
ll up(ll k,ll j){
	return (f[j]+s[j]*s[j])-(f[k]+s[k]*s[k]);
}
//分母
ll down(ll k,ll j){
	return s[j]-s[k];
}
int main(){
	while(scanf("%lld%lld",&n,&m)!=EOF){
		ll i,j;
		for(i=1;i<=n;i++)scanf("%lld",&c[i]);
		s[0]=0;
		for(i=1;i<=n;i++)s[i]=s[i-1]+c[i];
		ll front=1,rear=1;
		q[1]=0;
		f[0]=0;
		for(i=1;i<=n;i++){
			while(front<rear&&up(q[front],q[front+1])<=2*s[i]*down(q[front],q[front+1]))front++;
			ll j=q[front];
			f[i]=f[j]+(s[i]-s[j])*(s[i]-s[j])+m;
			while(front<rear&&up(q[rear-1],q[rear])*down(q[rear],i)>=up(q[rear],i)*down(q[rear-1],q[rear]))rear--;
			q[++rear]=i;
		}
		printf("%lld\n",f[n]);
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章