1a系列。 用f
[i] 表示在
i 這個點建立倉庫的,前i個工廠的貨物都能藏起來的最小費用。 顯然f
[i]=
c[i]
+min
w(j,
i)+f
[j]其中
w(j,
i)表示把(j
,i] 的貨物都運到
i 的費用 w(
j,i)
=∑k=
j+1i
p[k]
(x[i
]−x[
k])=
x[i]
∑k=j
+1ip
[k]−
∑k=j
+1ip
[k]x
[k]令
t[i]
=∑ij
=1p[
j]x[
j],sp[
j]=∑
ij=1
p[j]
w(j,i)=
x[i]
(sp[
i]−s
p[j]
)−t[
i]+t
[j]=
−x[i
]sp[
j]+t
[j]+
x[i]
sp[i
]−t[
i] f
[i]=
c[i]
+min
=c[i
]+mi
n 去掉m
in化成斜率優化式子 f[
i]=c
[i]−
x[i]
sp[j
]+t[
j]+f
[j]+
x[i]
sp[i
]−t[
i]t[
j]+f
[j]=
x[i]
sp[j
]+(f
[i]−
c[i]
−x[i
]sp[
i]+t
[i])
y=kx+b
yj=t
[j]+
f[j]
,ki=
x[i]
,xj=
sp[j
] 因為要最小化f[
i],所以維護下凸殼,斜率x[
i]是單調不下降的,且點的橫座標sp
[j] 單調不減,所以用佇列來維護凸殼。
卡我的地方主要在於,從隊尾或隊首彈出點的時候,應保證佇列中不能為空。
//斜率優化
#include
#include
#define maxn 1000005
#define ll long long
using namespace std;
ll n ,f[maxn], p[maxn], c[maxn], x[maxn], sp[maxn], t[maxn];
struct pointq[maxn];
ll read(ll x=0)
void init()
inline double getk(point p1, point p2)
void dp()
}void print()
int main()
bzoj 1096 ZJOI2007 倉庫建設
time limit 10 sec memory limit 162 mb submit 3607 solved 1582 submit status discuss l公司有n個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠n在山腳。由於這座山處於高原內 陸地區 乾燥少雨 l公司一般把...
bzoj 1096 ZJOI2007 倉庫建設
l公司有n個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠n在山腳。由於這座山處於高原內陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁l先生接到氣象部門的 被告知三天之後將有一場暴雨,於是l先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。由於地形...
BZOJ1096 ZJOI2007 倉庫建設
description l公司有n個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠n在山腳。由於這座山處於高原內 陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁l先生接到氣象 部門的 被告知三天之後將有一場暴雨,於是l先生決定緊急在某些工廠建立一些...