3437: 小P的牧场

来源:互联网 发布:淘宝旺旺聊天怎么撤销 编辑:程序博客网 时间:2024/05/01 18:20

斜率优化什么的真心无脑。

令sum[i]=sigma(b[k])(k<=i) mul[i]=sigima(k*b[k])(k<=i)。

则f[i]=min(f[j]+i*(sum[i]-sum[j])-mul[i]+mul[j])(j<i)

单调队列维护就好了。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N=1000000+5;typedef long long ll;ll f[N],sum[N],mul[N],a[N],b;int q[N];double slop(int j,int k){return (double)(f[j]+mul[j]-f[k]-mul[k])/(double)(sum[j]-sum[k]);}int main(){int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);for(int i=1;i<=n;i++){scanf("%lld",&b);sum[i]=sum[i-1]+b;mul[i]=mul[i-1]+b*i;}int h=1,t=1;q[1]=0;for(int i=1;i<=n;i++){while(h<t&&slop(q[h+1],q[h])<i)h++;int j=q[h];f[i]=f[j]+i*(sum[i]-sum[j])-mul[i]+mul[j]+a[i];while(h<t&&slop(q[t-1],q[t])>slop(q[t],i))t--;q[++t]=i;}printf("%lld",f[n]);return 0;}


0 0
原创粉丝点击