Print Article
悲剧。不是数组写小就是小于号写反。。。
明天比赛,期待RP爆发!
所谓的斜率优化就是对头维持单调,队尾维护凸点!
#include <iostream>
#include <cmath>
using namespace std;
const int N=500010;
__int64 dp[N];
__int64 sum[N],dia;
int Q[N];
int n,m;
__int64 cal(int c,int k)
{
return dp[c]+(sum[k]-sum[c])*(sum[k]-sum[c])+m;
}
__int64 Y(int c)
{
return dp[c]+sum[c]*sum[c];
}
int main()
{
int i,j;
while(scanf("%d %d",&n,&m)!=EOF)
{
sum[0] = 0;
for(i=1;i<=n;i++)
{
scanf("%d",&dia);
sum[i]=sum[i-1]+dia;
}
int head,tail;
head=0;
tail=-1;
dp[0]=0;
Q[++tail]=0;
for(i=1;i<=n;i++)
{
while(tail-head>=1 && cal(Q[head],i)>=cal(Q[head+1],i) )
head ++;
dp[i] = cal(Q[head],i);
while(tail-head>=1 && (sum[Q[tail]] - sum[Q[tail-1]])*(Y(i)-Y(Q[tail-1]))<=
(sum[i]-sum[Q[tail-1]])*(Y(Q[tail]) - Y(Q[tail-1])) )
tail --;
Q[++tail] = i;
}
printf("%I64d/n",dp[n]);
}
return 0;
}