现在的位置: 首页 > 算法 > 正文

[Bzoj1911][Apio2010]特别行动队

2018年01月13日 算法 ⁄ 共 769字 ⁄ 字号 评论关闭
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return f*x;
}
int n,a,b,c,x,q[1000005],l,r;
long long sum[1000005],f[1000005];
inline long long sqr(long long x){return x*x;}
inline double calc(int k,int j){
    return (double)(f[j]-f[k]+a*(sqr(sum[j])-sqr(sum[k]))+b*(sum[k]-sum[j]))/(double)(2*a*(sum[j]-sum[k]));
}
int main(){
    n=read();a=read();b=read();c=read();
    for(int i=1;i<=n;i++){
        x=read();sum[i]=sum[i-1]+(long long)x;
    }
    for(int i=1;i<=n;i++){
        while(l<r&&calc(q[l],q[l+1])<sum[i])l++;
        int t=q[l];
        f[i]=f[t]+a*sqr(sum[i]-sum[t])+b*(sum[i]-sum[t])+c;
        while(l<r&&calc(q[r-1],q[r])>calc(q[r],i))r--;
        q[++r]=i;
    }
    printf("%lld",f[n]);
    return 0;
}

抱歉!评论已关闭.