BZOJ 1911 特别行动队(斜率优化dp)

来源:互联网 发布:怎么查手机的网络制式 编辑:程序博客网 时间:2024/05/07 01:06

题目链接

http://www.lydsy.com/JudgeOnline/problem.php?id=1911


#include<cstdio>#include<cstring>#include<iostream>#include<queue>using namespace std;#define maxn (1000000+10)int N,A,B,C;int q[maxn];long long sum[maxn],dp[maxn];void input(){scanf("%d",&N);scanf("%d%d%d",&A,&B,&C);for(int i=1;i<=N;i++){scanf("%lld",&sum[i]);sum[i]+=sum[i-1];}}long long up(int a,int b){return dp[b]-dp[a]+A*(sum[b]*sum[b]-sum[a]*sum[a])+B*(sum[a]-sum[b]);}long long down(int a,int b){return 2*A*(sum[b]-sum[a]);}void solve(){int head=0,tail=0;q[tail++]=0;for(int i=1;i<=N;i++){while(head<tail-1&&up(q[head],q[head+1])>=sum[i]*down(q[head],q[head+1]))head++;int L=q[head];dp[i]=dp[L]+A*(sum[i]-sum[L])*(sum[i]-sum[L])+B*(sum[i]-sum[L])+C;while(head<tail-1&&up(q[tail-1],i)*down(q[tail-2],q[tail-1])<=up(q[tail-2],q[tail-1])*down(q[tail-1],i))tail--;q[tail++]=i;}cout<<dp[N];}int main(){input();solve();return 0;}


0 0
原创粉丝点击