樸素方程: f[
i]=m
in(f
[j]+
(sum
[i]−
sum[
j])∗
x[i]
−(pr
e[i]
−pre
[j])
)+c[
i]其中,su
m[i]
表示pi
的字首和,pr
e[i]
表示pi
∗xi 的字首和
假設這一段的物品從起點運出,得到花費為(s
um[i
]−su
m[j]
)∗x[
i],而起點不在0處,那麼對於物品pi
可以少運xi
的距離,那麼就應該減去∑i
k=j+
1pi∗
xi
時間複雜度o(
n2)
考慮優化,假設
j<
k 並且
k 比
j更優
那麼得到不等式 f[
k]+(
sum[
i]−s
um[k
]∗x[
i]−(
pre[
i]−p
re[k
]))≤
f[j]
+(su
m[i]
−sum
[j]∗
x[i]
−(pr
e[i]
−pre
[j])
) 化簡得到f[
j]+b
[j]−
(f[k
]+b[
k])s
um[j
]−su
m[k]
≤x[i
] 設s
lope
(k,j
)=f[
j]+b
[j]−
(f[k
]+b[
k])s
um[j
]−su
m[k]
剩下的,就是單調佇列優化,如果隊頭元素滿足sl
ope(
que[
l+1]
,que
[l])
那麼隊頭元素彈出,如果隊尾元素滿足sl
ope(
i,qu
e[r]
)ope(
que[
r],q
ue[r
−1])
,隊尾元素彈出
時間複雜度o(
n)
#include
using
namespace
std;
typedef
long
long ll;
typedef
double dl;
const
int sn = 1000000 + 10;
ll f[sn], sum[sn], x[sn], n, p[sn], c[sn], pre[sn];
ll que[sn], head, tail;
void read(ll &x)
while(ch>='0' && ch<='9')
x = in*f;
}ll get_1(int k, int j)
ll get_2(int k, int j)
dl get_3(int k, int j)
int main()
for(int i = 1; i <= n; i++)
printf("%lld\n",f[n]);
return
0;}
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 倉庫建設
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...