#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
LL n,ans=999999999;
LL w[2001000],dis[2001000],sw[2001000],val[2001000],d[2001000];
LL q[2001000];
double Slpoe(int j,int k)
{
return (dis[j]*val[j]-dis[k]*val[k])*1.0/(val[j]-val[k]);
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&w[i],&d[i]);
val[i]=val[i-1]+w[i];
dis[i]=dis[i-1]+d[i-1];
sw[i]=sw[i-1]+d[i-1]*val[i-1];// cout<<sw[i]<<" ";
}
val[n+1]=val[n];
dis[n+1]=dis[n]+d[n];
sw[n+1]=sw[n]+val[n]*d[n];
// for(int i=1;i<=n+1;i++) cout<<dis[i]<<' '<<val[i]<<' '<<sw[i]<<endl;
int l=1,r=1;
for(int i=1;i<=n;i++)
{//cout<<q[l]<<' '<<q[l+1];
while(l<r&&Slpoe(q[l],q[l+1])<dis[i])l++;//l+1比l更优,向上走
LL j=q[l];
ans=min(ans,sw[n+1]-val[j]*(dis[i]-dis[j])-val[i]*(dis[n+1]-dis[i]));
while(l<r&&Slpoe(q[r-1],q[r])>Slpoe(q[r],i)) r--;
q[++r]=i; //cout<<i<<' '<<j<<endl;
}
printf("%lld\n",ans);
return 0;
}
【CEOI2004】锯木厂选址(斜率优化入门题)
最新推荐文章于 2021-04-29 15:13:33 发布