1. 程式人生 > >1096. [ZJOI2007]倉庫建設【斜率優化DP】

1096. [ZJOI2007]倉庫建設【斜率優化DP】

表示 倉庫 單位 符號 output while 目前 data 兩個

Description

  L公司有N個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠N在山腳。由於這座山處於高原內
陸地區(幹燥少雨),L公司一般把產品直接堆放在露天,以節省費用。突然有一天,L公司的總裁L先生接到氣象
部門的電話,被告知三天之後將有一場暴雨,於是L先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。由於
地形的不同,在不同工廠建立倉庫的費用可能是不同的。第i個工廠目前已有成品Pi件,在第i個工廠位置建立倉庫
的費用是Ci。對於沒有建立倉庫的工廠,其產品應被運往其他的倉庫進行儲藏,而由於L公司產品的對外銷售處設
置在山腳的工廠N,故產品只能往山下運(即只能運往編號更大的工廠的倉庫),當然運送產品也是需要費用的,

假設一件產品運送1個單位距離的費用是1。假設建立的倉庫容量都都是足夠大的,可以容下所有的產品。你將得到
以下數據:1:工廠i距離工廠1的距離Xi(其中X1=0);2:工廠i目前已有成品數量Pi;:3:在工廠i建立倉庫的費用
Ci;請你幫助L公司尋找一個倉庫建設的方案,使得總的費用(建造費用+運輸費用)最小。

Input

  第一行包含一個整數N,表示工廠的個數。接下來N行每行包含兩個整數Xi, Pi, Ci, 意義如題中所述。

Output

  僅包含一個整數,為可以找到最優方案的費用。

Sample Input

3
0 5 10
5 3 100
9 6 10

Sample Output

32

HINT

在工廠1和工廠3建立倉庫,建立費用為10+10=20,運輸費用為(9-5)*3 = 12,總費用32。如果僅在工廠3建立倉庫,建立費用為10,運輸費用為(9-0)*5+(9-5)*3=57,總費用67,不如前者優。

【數據規模】

對於100%的數據, N ≤1000000。 所有的Xi, Pi, Ci均在32位帶符號整數以內,保證中間計算結果不超過64位帶符號整數。

f[i]表示在i建設倉庫的最小花費
f[i]=f[j]+cost(j+1,i)
cost可以用後綴和搞一下
f[i]=min( f[i], f[j] + cost[j+1]-cost[i]-(sump[j+1]-sump[i])*sumx[i] +c[i] );


#include<iostream>
#include<cstring>
#include<cstdio>
#define N (1000000+100)
#define LL long long
using namespace std;
LL f[N],sump[N],sumx[N],x[N],p[N],c[N],cost[N],n;
LL q[N],head,tail;

LL K(LL j) {return -sump[j+1];}
LL B(LL j) {return f[j]+cost[j+1];}
LL Y(LL i,LL j) {return K(j)*sumx[i]+B(j);}

bool cover(LL x1,LL x2,LL x3)
{
	LL w1=(K(x3)-K(x1))*(B(x1)-B(x2));
	LL w2=(K(x2)-K(x1))*(B(x1)-B(x3));
	return w1>=w2;
}

int main()
{
	scanf("%lld",&n);
	for (int i=1;i<=n;++i)
		scanf("%lld%lld%lld",&x[i],&p[i],&c[i]);
	for (int i=n;i>=1;--i)
	{
		sump[i]=sump[i+1]+p[i];//i到n的產品和 
		sumx[i]=x[n]-x[i];//i到n的距離 
	}
	for (int i=n-1;i>=0;--i)
		cost[i]=cost[i+1]+p[i]*sumx[i];//cost[i]表示i..n物品都運到n的總花費 
	head=1,tail=1;
	for (int i=1;i<=n;++i)
	{
		while (head<tail && Y(i,q[head])>=Y(i,q[head+1])) head++;
		f[i]=Y(i,q[head])-cost[i]+sump[i]*sumx[i]+c[i];
		while (head<tail && cover(i,q[tail],q[tail-1])) tail--;
		q[++tail]=i;
	}
	printf("%lld",f[n]); 
}

1096. [ZJOI2007]倉庫建設【斜率優化DP】