洛谷P2120 [ZJOI2007]仓库建设 斜率优化DP

做的第一道斜率优化\(DP\)QwQ
原题链接1/原题链接2
首先考虑\(O(n^2)\)的做法:设\(f[i]\)表示在\(i\)处建仓库的最小费用,则有转移方程:

$f[i]=min\{f[j]+\sum\limits_{k=j+1}^{i}P[k](X[i]-X[k])\}+C[i]$
于是我们枚举$i$,再从$i-1$开始从大到小枚举$j$,并记录一个前缀和,每次更新一下$f[i]$。洛咕上貌似拿了66分,数据太水: ```cpp #include

using namespace std;

define ll long long

define N 1000000

define re register

int n, X[N+5], P[N+5], C[N+5];
ll f[N+5];

inline char Getchar() {
static char buf[100000], *p1 = buf, p2 = buf;
return p1p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1p2)?EOF:
p1++;
}

inline int read() {
int s = 0; re char c = Getchar();
while(c < '0' || c > '9') c = Getchar();
while(c >= '0' && c <= '9') s = s*10+c-'0', c = Getchar();
return s;
}

template T min(T x, T y) { return x < y ? x : y; }

int main() {
n = read();
for(re int i = 1; i <= n; ++i) X[i] = read(), P[i] = read(), C[i] = read(), f[i] = 9223372036854775807LL;
f[0] = 0;
for(re int i = 1; i <= n; ++i) {
ll sum = 0, d = 0;
for(re int j = i-1; j >= 0; --j) {
f[i] = min(f[i], f[j]+sum+C[i]);
d += X[j+1]-X[j];
sum += P[j]*d;
}
}
printf("%lld", f[n]);
return 0;
}

那正解应该怎么做呢?经过观察,发现上面的转移方程已经无法再进行常规的优化了,此时我们需要斜率优化了。就拿这道题来说吧:
首先我们改写一下转移方程。若令:
<center>$sum1[i]=\sum\limits_{j=1}^{i}P[j]\ \ \ \  sum2[i]=\sum\limits_{j=1}^{i}P[j]X[j]$</center>
则$f[i]$可表示为:
<center>$f[i]=min\{f[j]+X[i](sum1[i]-sum1[j])-(sum2[i]-sum2[j])\}+C[i]$</center>
此时转移到了$i$,对于$j>k,j,k\in[0,i-1]$来说,若选$j$比选$k$更优,我们可以得到下式:
$$f[j]+X[i](sum1[i]-sum1[j])-(sum2[i]-sum2[j])<f[k]+X[i](sum1[i]-sum1[k])-(sum2[i]-sum2[k])\\
=>f[j]+sum2[j]-f[k]-sum2[k]<X[i]sum1[j]-X[i]sum1[k]\\
=>\frac{f[j]+sum2[j]-f[k]-sum2[k]}{sum1[j]-sum1[k]}<X[i]$$
当上式成立时,选$j$更优
此时我们令$y_i=f[i]+sum2[i],x_i=sum1[i]$,则上式表示的就是平面上两点$P_j$和$P_k$所确定的直线的斜率。如果我们把所有转移点的图像绘制出来的话,会长成下面这样:
<img src='data:img/jpg;base64,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
r69OngawbYdvbnpbkw1SZlW68Opm+h2n20wz/04EsGXT75/dO5v6jE1RZoW68Do9+R0IYPPW72xO
9Bkbocxqdfl1YvJ7D8Dmzb9/rn9m03eesQXKrFDXXqcnv/EAbF5+D93p+ixbeFz+K6/V5dexyW85
AJuX3z2bT58+ffPNN7kpMzbAf+W1ugI7Nnk0AM3ytzYtfvrpp9zgcSmzcl2ErSePA6D58OHD4ZfK
JrKMjVBmV9LV2Dy5AXDgl19+SY41soztUGbXJsgA1v78888pyLq3LyeajK1RZgDc2MePH7v3Liff
fffd58+f8wjYDGUGwC11P305e/funSxjm5QZADfTZZk/5R+UGQC30f0Apm8pg4kyA+AGfv311xTZ
jiyDmTID4AYOfwxTlsFCmQFwA/MfWvb999/7Tn84pMwAuI0//vgjHwGNMgMAGIUyAwAYhTIDABiF
MgMAGIUyAwAYhTIDABiFMgMAGIUyAwAYhTIDABiFMgMAGIUyAwAYhTIDABiFMgMAGIUyAwAYhTID
ABiFMgMAGIUyAwAYhTIDABiFMgMAGIUyAwAYhTIDABiFMgMAGIUyAwAYhTIDABiFMgMAGIUyAwAY
hTIDABiFMgMAGIUyAwAYhTIDABiFMgMAGIUyAwAYhTIDABiFMgMAGIUyAwAYhTIDABiFMgMAGIUy
AwAYhTIDABiFMgMAGIUyAwAYhTIDABiFMgMAGIUyAwAYhTIDABiFMgMAGIUyAwAYhTIDABiFMgMA
GMP//vd/XcQ3t05AXyMAAAAASUVORK5CYII='/>
观察绿色的部分,我们会发现一些有趣的性质:
<img src='data:img/jpg;base64,iVBORw0KGgoAAAANSUhEUgAAAzMAAAHMCAIAAABukmEEAAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAACDsSURBVHhe7d1vjFXlvehxhnuv0N6b2z+ntVps
AxbrrbFGLrGHaDo27TUpPaMx2pwAN2nl1CPgC0eTq9FaIkROtfqG4YWMHpPBFwdM07H+aYUepTmH
pobbE6KhSoOgl6D3SLEVa2IBvXHuYp7FcnfvPXv2zOy197PW+nxC5Fl7fNNxkvn29zxrrb6xsbFZ
AABEYHb6NwAAvabMAABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAAYqHM
AABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAA
YqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKh
zAAAYqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAAYqHMAABiocwA
AGKhzHK3Y8eOBeO2bNmSfgQA0Ezf2NhYuiQfZ5999pEjR5LF3Llzjx8/Hj4EAGhkZpajt99++5Zb
bglZljhx4sQLL7wQ1gAAjZRZXh5//PEFCxZs3LgxvR63fv36dAUA0ECZ5WLHjh0rV658++230+vT
kly799570wsAgL/knFmHbdmyZf369YcOHUqvGzhtBgBMxMysk4aHh1euXFmbZatXr05Xp504cSJd
AQD8JTOzTspuwwySLNu8eXNfX196fZrvOQDQlJlZJ2VZdvz48SS/kiwLl3XWrVuXrgAAaiizjhke
Hk5X44fJ0lUz69evdx8AANDIbmZnHDlyZMGCBeEM2bJly7Zt2xY+TzTuZibcBwAANDIz64wf/ehH
IcsuvvjikZGR8GFTYZzmqbMAQCNl1hmPPvpoWNx1112ttzKvvvrqsPDUWQCgjt3MDhgeHl6zZk1Y
N34/63Yzn3/++UWLFoX1yMjIddddF9YAAMqsA7KHZdSdMAvqyiz5hn/kIx8JW59z587dvHmzOAMA
AruZMzU8PJw9LKP1CbPMXXfdFRZJn2XDNgAAZTYjO3bsuOOOO8J62bJlrU+YZW6//fZ77rknrJM4
27JlS1gDABVnN3P6kixbvnx59try48ePNy2zxt3MsKjd0/QEDQAgYWY2fWvWrMmybPXq1W0OzDK1
e5rGZgBAwsxs+u69996wlRnejxk+bDTRzCxhbAYA1DIzm77bb789yaxEiyxrrXZs5n1NAICZWe5a
zMwSt9xyy8aNG5PF3Llzjx07NtUtUQCgTMzMeuyee+5ZtmxZsmj/1k4AoKzMzHLXemYWHDly5Kyz
zkovAICqUma5a6fMAAASdjMBAGKhzAAAYqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAAYqHM
AABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAA
YqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKh
zAAAYqHMAABiocwAAGKhzAAAYqHMAABiocwAAGKhzAAAYtE3NjaWLslHX19fuhrnGw6ZXUf3rN27
+fU//z69bsM5H/3MTV9cfu3nv5FeF83Xlu4Ji3/ZvjgsAGops9wpMyrunfffHXn1icde++WUCmxS
SaJdcfaSVQuv/fScT6QfRS/LskCcAY2UWe6UGVWTU4o1NWf2GSsWLC1En9VlWUKZAY2UWe6UGVUw
enjnppe3TS/FVsxfevdFN6YXLQ0f+Mn9v3skvahRiD5TZkA7lFnulBnl1s5ZsTwOhz3zxu6kBff9
6dX0ukaEG52yDGiTMsudMqOsWjRZ187pt+izObPPuOn85avP+3Z63TuyDGifMsudMqNkJjpGNjCv
/75Fg0kPpddd1KLPkjgbPH9FetELjVmWUGbARJRZ7pQZRdfOif72z4p1QV2o9XBzU5YBU6XMcqfM
iF93zu9308kP3lv9mx/uOvphGPVkc9M+JjBVyix3yoxoTTvIunaMbCaSOFu7d/Po4WfT63G3fum7
XYszWQZMgzLLnTKj+2YyA2uqECk2kdrNzTmzz7j7ohu78D9ElgHTo8xyp8zommm87CjTw/P7XXDy
g/cWPb08+WeyTv43/uDC61fMXxq+lAfHy4BpU2a5U2bkaoYP3C93kNWqe0ptrtuaBmbAtCmz3Ckz
8rP10PakNpI4S69rVCe52lcbZ8l3Zt/AaFh3liwDZkKZ5U6Z0XH7/vTqY6//8pk3djedk8V5s2Qk
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
KbMyMDADgHJQZsVjYAYAZaXMCs/ADABKQ5kVjIEZAJSYMis2AzMAKBNlViQGZgBQbsqswAzMAKBk
lFlhGJgBQOkps6IyMAOA8lFmxWBgBgBVoMwKycAMAEpJmRWAgRkAVIQyKx4DMwAoK2UWOwMzAKgO
ZVYwBmYAUGLKLGoGZgBQKcqsSAzMAKDclFm8DMwAoGqUWWEYmAFA6SmzSBmYAUAFKbNiMDADgCpQ
ZjEyMAOAalJmBWBgBgAVocyiY2AGAJWlzGJnYAYA1aHM4mJgBgBVpsyiZmAGAJWizCJiYAYAFafM
4mVgBgBVo8xiYWAGACizSBmYAUAFKbMoGJgBAAllFiMDMwCoJmXWewZmAECgzKJjYAYAlaXMeszA
DADIKLO4GJgBQJUps14yMAMAaimziBiYAUDFKbOeMTADAOoos1gYmAEAyqw3DMwAgEbKLAoGZgBA
Qpn1gIEZANCUMuu2tz53Xro6zcAMAAiUWZf88ZyF4c81Fz762IvLkj/pFwAATusbGxtLl+SjcUhW
55OvHUhXAEC1mZnla9IsS7Tz7wCU1Y4dOxYsWNDX15f8c8uWLemnUFVmZvlqs7qMzYDKSoLs0KFD
YT137tzjx4+HNVSTmVmO2h+GGZsBlbVq1ap0NWvWiRMnDM+oOGUGQC/dfvvtY2NjN998c3o9a9ah
Q4fWrFkjzqgmu5k5mtIkzIYmUGUnTpyoqzE7m1STmVlebFACtC/psJGRkbGxsXvuuSd8krSabU0q
yMwsL63L7K9eP/jHcxamF6clH6YrgKpKfivdcsstGzduTK9nzZo/f/5dd9113XXXpddQasosR1Ma
m8kygOD48eON58z0GRWhzPLVfpwpM4Ag/GK6995777jjjvBJ4OQZVeCcWY4cNQOYtnDPZnbsLHHi
xIl0BeWlzHLU/u2WBmYAQd1OzsUXX/zxj388vYAKsJuZrzbHZh6ZAVBnx44da9asyV4PkFi9evXm
zZvTCygpM7N8tZNcsgygzpYtW5YvXy7LqCAzsy5pOjzTZACN1q1bt379+vRinCyjOpRZtyWJJsgA
6rz99tsbN2585JFHaudkCU1G1SgzAHrs8ccfX7lyZRJn6fW4b37zmz/96U/nzp2bXkM1OGcGQC/t
2LGjMcuWLVsmy6gmMzMAeibJsuXLl2dZNjIy4in/VJyZGQC9EW7AzLJs9erVsgzMzADogeHh4TVr
1qQXTvrDacoMgB5YsGBBdhumLIOM3UwAeuC73/1u8s+rr776+PHjsgwyZmYA9MaRI0fOOuus9AIY
p8wAAGJhNxMAIBbKDAAgFsoMACAWygwAIBbKDAAgFsoMACAWygwAIBbKDAAgFsoMACAWygwAIBbK
DAAgFsoMACAWygwAIBbKDAAgFsoMACAWygwAIBbKDAAgFsoMACAWygwAIBbKDAAgFsoMACAWygwA
IBbKDAAgFsoMACAWygwAIBbKDAAgFsoMACAWygwAIBbKDAAgFsoMACAWygwAIBbKDAAgFsoMACAW
ygwAIBbKDAAgFsoMACAWygwAIBbKDAAgFsoMACAWygwAIBbKDAAgFsoMACAWygwAIBbKDAAgFsoM
ACAWygwAIBbKDAAgFsoMACAOs2b9fzVjfwepVVTbAAAAAElFTkSuQmCC'/>
分类讨论,有以下$3$种情况:
1.$X[i]>Slope(k,j)>Slope(j,i)$,$j$比$k$,$i$比$j$优
2.$Slope(k,j)>X[i]>Slope(j,i)$,$k$比$j$,$i$比$j$优
3.$Slope(k,j)>Slope(j,i)>X[i]$,$k$比$j$,$j$比$i$优
也就是说,在这种情况下,选$j$无论如何也不可能是最优的,于是我们可以把$j$去掉了。然后,得到的是一个下凸(是下凸吧)函数的图像:
<img src='data:img/jpg;base64,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'/>
此时我们再看看从这个图像上的哪一个点转移最优:假设$Slope(j,i)>X[i],Slope(k,j)<X[i]$,不难得出,$j$比左边所有的点都优,比右边的点也都优。所以我们从$j$点转移是最优的。又因为$X[i]$具有单调性,所以我们维护一个单调队列,每次从斜率大于等于$X[i]$的第一条直线的左端点转移就好了。
```cpp
#include <cstdio>

using namespace std;

#define N 1000000
#define ll long long
#define re register

int n, h = 1, t = 1, q[N+5], X[N+5], P, C[N+5];
ll f[N+5], sum1[N+5], sum2[N+5];

inline char Getchar(){
    static char buf[2048], *p1=buf, *p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,2048,stdin),p1==p2)?EOF:*p1++;
}

inline int read() {
    int s = 0; char c = Getchar();
    while(c < '0' || c > '9') c = Getchar();
    while(c >= '0' && c <= '9') s = s*10+c-'0', c = Getchar();
    return s;
}

template <typename T> T min(T x, T y) { return x < y ? x : y; }

inline double getK(const int &j, const int &k) {
    return 1.0*(f[j]+sum2[j]-f[k]-sum2[k])/(sum1[j]-sum1[k]);
}

int main() {
    n = read();
    for(int i = 1; i <= n; ++i) {
        X[i] = read(), P = read(), C[i] = read();
        sum1[i] = sum1[i-1]+P, sum2[i] = sum2[i-1]+P*X[i];
        f[i] = X[i]*sum1[i]-sum2[i]+C[i];
    }
    for(int i = 1, j; i <= n; ++i) {
        while(h+1 < t && getK(q[h], q[h+1]) < X[i]) h++;
        j = q[h];
        if(j) f[i] = min(f[i], f[j]+X[i]*(sum1[i]-sum1[j])-(sum2[i]-sum2[j])+C[i]);
        while(h+1 < t && getK(q[t-2], q[t-1]) > getK(q[t-1], i)) t--;
        q[t++] = i;
    }
    printf("%lld\n", f[n]);
    return 0;
}
posted @ 2018-10-13 10:15  dummyummy  阅读(1571)  评论(0编辑  收藏  举报