斜率优化裸体
很容易写出暴力dp
dp[i]=min(dp[j]+(s+t[i]-t[j])*f[i])
#include<cstdio>
#include<iostream>
double dp[11000],S,t[11000],f[11000];
int head=1,tail=1,z[11000],n;
double k(int x,int y){
return (dp[y]-dp[x])/(t[y]-t[x]);
}
int main(){
scanf("%d%lf",&n,&S);
for(int i=1;i<=n;i++) scanf("%lf%lf",&t[i],&f[i]);
for(int i=n;i;i--) t[i]+=t[i+1],f[i]+=f[i+1];
dp[n]=f[n]*(S+t[n]);z[1]=n;
for(int i=n-1;i;i--){
while(head<tail&&k(z[head],z[head+1])<f[i]) head++;
dp[i]=std::min(dp[z[head]]+(S+t[i]-t[z[head]])*f[i],(S+t[i])*f[i]);
while(head<tail&&k(z[tail-1],z[tail])>k(z[tail-1],i)) tail--;
z[++tail]=i;
}
printf("%d",(int)dp[1]);
}