日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【斜率优化】仓库建设(luogu 2120)

發布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【斜率优化】仓库建设(luogu 2120) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

倉庫建設

luogu 2120

題目大意

有一個斜坡,上面有n個工廠(山頂是1,山腳是nnn,工廠都是漏填),上面有pip_ipi?個貨物,和工廠1的距離為x1x_1x1?
現在有一場大雨,你可以在某些工廠處建立倉庫(費用是cic_ici?),沒有建立倉庫的工廠要把貨物運到更低的倉庫(及編號越大的倉庫),運費是貨物數?*?距離
現在問你全部貨物運到倉庫中最少需要多少錢

輸入樣例

3 0 5 10 5 3 100 9 6 10

輸出樣例

32

樣例說明

在工廠 1 和工廠 3 建立倉庫,建立費用為 10+10=2010+10=2010+10=20 ,運輸費用為 (9?5)×3=12(9-5) \times 3 = 12(9?5)×3=12,總費用 32。

數據范圍

對于 20%20\%20% 的數據,保證 n≤500n \leq 500n500
對于 40%40\%40% 的數據,保證 n≤104n \leq 10^4n104
對于 100%100\%100% 的數據,保證 1≤n≤1061 \leq n \leq 10^61n1060≤xi,pi,ci<2310 \leq x_i,~p_i,~c_i < 2^{31}0xi?,?pi?,?ci?<231
對于任意的 1≤i<n1 \leq i < n1i<n,保證 xi<xi+1。x_i < x_{i + 1} 。xi?<xi+1?
設答案為 ansansans,保證 ans+∑i=1npixi<263ans + \sum_{i = 1}^{n} p_ix_i < 2^{63}ans+i=1n?pi?xi?<263

解題思路

我們設fif_ifi?為在iii處建倉庫,前iii個工廠的貨物全部運到倉庫的最小費用(這里把ppp改為sss,把xxx改為vvv
我們就可以得出轉移方程
fi=min?{fj+ci+∑k=j+1i?1(vi?vk)sk}=min?{fj+ci+∑k=j+1i(vi?vk)sk}=min?{fj+ci+∑k=j+1ivisk?∑k=j+1ivksk}=min?{fj+ci+(sumsi?sumsj)vi?(vsi?vsj)}\begin{aligned}f_i & = \min\{f_j+c_i+\sum_{k=j+1}^{i-1}(v_i-v_k)s_k\} \\ & = \min\{f_j+c_i+\sum_{k=j+1}^{i}(v_i-v_k)s_k\} \\ & =\min\{f_j+c_i+\sum_{k=j+1}^{i}v_is_k-\sum_{k=j+1}^{i}v_ks_k\} \\ & = \min\{f_j + c_i + (sums_i-sums_j)v_i - (vs_i - vs_j)\} \end{aligned}fi??=min{fj?+ci?+k=j+1i?1?(vi??vk?)sk?}=min{fj?+ci?+k=j+1i?(vi??vk?)sk?}=min{fj?+ci?+k=j+1i?vi?sk??k=j+1i?vk?sk?}=min{fj?+ci?+(sumsi??sumsj?)vi??(vsi??vsj?)}?
注:
第二行加了iii這一項,但因為vi?vi=0v_i-v_i=0vi??vi?=0所以結果不變
第四行vsi=∑j=1ivisivs_i=\sum_{j=1}^{i} v_is_ivsi?=j=1i?vi?si?
若現在有兩個決策點a,ba,ba,b滿足a>b,aa>b,aa>b,a優于bbb
則:
fa+ci+(sumsi?sumsa)vi?(vsi?vsa)<fb+ci+(sumsi?sumsb)vi?(vsi?vsb)f_a + c_i + (sums_i-sums_a)v_i - (vs_i - vs_a) < f_b + c_i + (sums_i-sums_b)v_i - (vs_i - vs_b)fa?+ci?+(sumsi??sumsa?)vi??(vsi??vsa?)<fb?+ci?+(sumsi??sumsb?)vi??(vsi??vsb?)
fa+ci+sumsivi?sumsavi?vsi+vsa<fb+ci+sumsivi?sumsbvi?vsi+vsbf_a + c_i + sums_iv_i-sums_av_i - vs_i + vs_a < f_b + c_i + sums_iv_i-sums_bv_i - vs_i + vs_bfa?+ci?+sumsi?vi??sumsa?vi??vsi?+vsa?<fb?+ci?+sumsi?vi??sumsb?vi??vsi?+vsb?
fa?sumsavi+vsa<fb?sumsbvi+vsbf_a-sums_av_i + vs_a < f_b-sums_bv_i + vs_bfa??sumsa?vi?+vsa?<fb??sumsb?vi?+vsb?
(fa+vsa)?(fb+vsb)<sumsavi?sumsbvi(f_a+vs_a)-(f_b+vs_b)< sums_av_i-sums_bv_i(fa?+vsa?)?(fb?+vsb?)<sumsa?vi??sumsb?vi?
(fa+vsa)?(fb+vsb)<sumsavi?sumsbvi(f_a+vs_a)-(f_b+vs_b)< sums_av_i-sums_bv_i(fa?+vsa?)?(fb?+vsb?)<sumsa?vi??sumsb?vi?
((fa+vsa)?(fb+vsb))/(sumsa?sumsb)<vi((f_a+vs_a)-(f_b+vs_b))/(sums_a-sums_b)<v_i((fa?+vsa?)?(fb?+vsb?))/(sumsa??sumsb?)<vi?
我們設
yi=fi+vsay_i=f_i+vs_ayi?=fi?+vsa?
xi=sumsix_i=sums_ixi?=sumsi?

(ya?yb)/(xa?xb)<vi(y_a-y_b)/(x_a-x_b)<v_i(ya??yb?)/(xa??xb?)<vi?
然后按照斜率優化模板套即可

代碼

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; ll n, l, r, v[1000050], s[1000050], c[1000050], d[1000050], y[1000050], f[1000050], vs[1000050]; int main() {scanf("%d", &n);for (int i = 1; i <= n; ++i){scanf("%d%d%d", &v[i], &s[i], &c[i]);vs[i] = vs[i - 1] + v[i] * s[i];s[i] += s[i - 1];//s沒用,就直接弄成前綴和}for (int i = 1; i <= n; ++i){while(r > l && (y[d[l + 1]] - y[d[l]]) < v[i] * (s[d[l + 1]] - s[d[l]])) l++;//模板f[i] = f[d[l]] + c[i] + (s[i] - s[d[l]]) * v[i] - (vs[i] - vs[d[l]]);y[i] = f[i] + vs[i];while(r > l && (y[i] - y[d[r]])*(s[d[r]] - s[d[r-1]]) < (y[d[r]] - y[d[r-1]])*(s[i] - s[d[r]])) r--;d[++r] = i;}printf("%d", f[n]);return 0; }

總結

以上是生活随笔為你收集整理的【斜率优化】仓库建设(luogu 2120)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。