P2120 倉庫建設

2022-07-03 02:27:11 字數 1703 閱讀 3147

又是斜優, 這裡是直通車

\(n\) 個工廠, 每個工廠有三個屬性: 座標 \(x\), 物品數 \(p\), 建設花費 \(c\), 可以選若干工廠建倉庫, 第 \(i\) 個工廠的物品只能運往座標大於等於它的位置倉庫, 單個物品移動單位長度花費 \(1\).

求儲存所有貨物的最小花費

\(1 \leq n \leq 10^6, 0 \leq x, p, c \leq 2^, ans + \sum p_ix_i < 2^\)

設計 \(f_i\) 表示在 \(i\) 處設倉庫 (不一定只在 \(i\) 設), \([1, i]\) 所有貨物被儲存的最小花費

設 \(p_i\), \(p_ix_i\) 字首和 \(sump_i\), \(sumpx_i\), 寫出方程

\(sumpx_i\) 的意義是將 \([1, i]\) 的所有物品移動到座標 \(0\) 的花費, 所以我們就可以將移動費用理解成先把需要移動到 \(i\) 的物品移動到原點, 然後一起移動到 \(i\) 工廠

\[f_i = min(f_j + c_i + (sump_i - sump_j)x_i - sumpx_i + sumpx_j)

\]整理成函式

\[f_j + sumpx_j = sump_jx_i + f_i + sumpx_i - sump_ix_i - c_i

\]設 \(sumpx_i - sump_ix_i - c_i = k_i\)

\[f_j + sumpx_j = sump_jx_i + f_i + k_i

\]得到以 \(sump_j\) 為自變數, \(f_j + sumpx_j\) 為因變數, \(x_i\) 為斜率, \(f_i + k_i\) 為截距的函式

其中, 斜率 \(x_i\) 單調, 自變數 \(sump_i\) 單調, 因變數 \(f_j + sumpx_j\) 單調, 直接用斜率優化

打出**, 提交時是不開o2的最快** (\(99ms\), 最優解第一頁唯一沒開o2的), 開o2的最優解 (\(76ms\))

struct factory f[1000005]; // 工廠屬性 

struct hull h[1000005], then; // 凸殼

unsigned a[10005], now, n, l(1), r(1);

bool b[10005];

int main() // 各種預處理

for (register unsigned i(1); i <= n; ++i)

now = h[l].ad;

f[i].f = f[now].f + f[i].c + (f[i].sump - f[now].sump) * f[i].x - f[i].sumpx + f[now].sumpx; // 轉移

then.ad = i;

then.x = f[i].sump;

then.y = f[i].f + f[i].sumpx;

while (l < r && ((then.y - h[r].y) * (h[r].x - h[r - 1].x) < (h[r].y - h[r - 1].y) * (then.x - h[r].x)))

h[++r] = then;

} printf("%lld\n", f[n].f);

return wild_donkey;

}

洛谷 P2120 ZJOI2007 倉庫建設

題幹重點 第i個工廠目前已有成品ai件,在第i個工廠位置建立倉庫的費用是bi。對於沒有建立倉庫的工廠,其產品應被運往其他的倉庫進行儲藏 只能運往編號更大的工廠的倉庫,一件產品運送1個單位距離的費用是1 告訴你工廠的位置,在每乙個工廠建立倉庫的費用,以及它們原有產品的個數,產品只能往編號高的地方運,求...

洛谷 2120 倉庫建設(詳解)

倉庫建設 終於有時間寫寫部落格了!聽說這題是 noi ctsc 的哇!激動!先看題意!question 很熟悉吧,這是一道動態規劃的題 若要求從1 n的貨物全部都安置的最小費用,就要用1 n 1的最小費用去更新 這就轉化為了子問題的求解典型的dp。根據子問題的定義,我們可以定義dp方程 dp i 表...

洛谷 2120 ZJOI2007 倉庫建設

題目描述 l公司有n個工廠,由高到底分布在一座山上。工廠1在山頂,工廠n在山腳。由於這座山處於高原內陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁l先生接到氣象部門的 被告知三天之後將有一場暴雨,於是l先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。由於地形...