锯木厂选址 斜率dp优化

来源:互联网 发布:wps office 有mac版吗? 编辑:程序博客网 时间:2024/05/16 11:53

详细解释见点击打开链接

#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<cstring>#include<cstdio>#include<ostream>#include<istream>#include<algorithm>#include<queue>#include<string>#include<cmath>#include<set>#include<map>#include<stack>#include<vector>#define fi first#define se second#define pii pair<int,int>#define inf (1ll<<60)#define eps 1e-8#define ll long longusing namespace std;const int maxn=30005;int n;ll d[maxn];ll w[maxn];ll x[maxn];ll cost[maxn];int deq[maxn];double slope(int i,int j){    return 1.0*(w[i]*x[i]-w[j]*x[j])/(w[i]-w[j]);}ll all(int i,int j){    if(i>=j)        return 0;    return cost[j]-cost[i-1]-w[i-1]*(x[j]-x[i-1]);}int main(){    freopen("two.in","r",stdin);    freopen("two.out","w",stdout);    scanf("%d",&n);    for(int i=1;i<=n;i++) {        scanf("%I64d%I64d",&w[i],&d[i]);    }    w[0]=d[0]=x[1]=0;    for(int i=1;i<=n;i++) {        w[i]=w[i-1]+w[i];        x[i+1]=x[i]+d[i];    }    w[n+1]=w[n];    cost[1]=0;    for(int i=2;i<=n+1;i++) {        cost[i]=cost[i-1]+w[i-1]*d[i-1];    }    int s=0,e=-1;    ll ans=inf;    for(int i=1;i<=n;i++) {        while(s<e && slope(deq[s],deq[s+1])<=x[i])            s++;        while(s<e && slope(deq[e],deq[e-1])>=slope(i,deq[e]))            e--;        deq[++e] = i;        ans=min(ans,cost[deq[s]]+all(deq[s]+1,i)+all(i+1,n+1));    }    printf("%I64d\n",ans);    fclose(stdin);    fclose(stdout);    return 0;}


0 0
原创粉丝点击