BZOJ1096 ZJOI2007 倉庫建設

2021-08-01 13:26:52 字數 1880 閱讀 1103

樸素方程: 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...