[BZOJ1010][HNOI2008]玩具装箱toy 斜率优化第一题
2015-12-16 17:13
453 查看
很明显我们得到朴素的转移方程dp[i]=min{dp[j]+(i−j−1+sum[i]−sum[j]−L)2,dp[i]} (0≤j<i)dp[i]=min\{dp[j]+(i-j-1+sum[i]-sum[j]-L)^2,dp[i]\}~~(0\le j
时间复杂度为O(N2)O(N^2)
我们定义f[i]=sum[i]+i,C=L+1f[i]=sum[i]+i,C=L+1,那么上式转变成dp[i]=min{dp[j]+(f[i]−f[j]−C)2,dp[i]} (0≤j<i)dp[i]=min\{dp[j]+(f[i]-f[j]-C)^2,dp[i]\}~~(0\le j
然后我们来证明决策的单调性
假设在ii处有两个决策点j,k(j<k)j,k(j,且kk的决策比jj好
即要证明dp[j]+(f[i]−f[j]−C)2>dp[k]+(f[i]−f[k]−C)2——————[1]\begin{eqnarray*}dp[j]+(f[i]-f[j]-C)^2&\gt&dp[k]+(f[i]-f[k]-C)^2——————[1]\end{eqnarray*}
假设i后面的某状态t有f[t]=f[i]+v (t>i)假设i后面的某状态t有f[t]=f[i]+v~~(t>i)
我们想知道ii对于后面状态tt的影响,那么要证明
dp[j]+(f[t]−f[j]−C)2dp[j]+(f[i]+v−f[j]−C)2dp[j]+(f[i]−f[j]−C)2+2⋅v⋅(f[i]−f[j]−C)+v2>>>dp[k]+(f[t]−f[k]−C)2dp[k]+(f[i]+v−f[k]−C)2dp[k]+(f[i]−f[k]−C)2+2⋅v⋅(f[i]−f[k]−C)+v2\begin{eqnarray*}dp[j]+(f[t]-f[j]-C)^2&\gt&dp[k]+(f[t]-f[k]-C)^2\\ dp[j]+(f[i]+v-f[j]-C)^2&\gt&dp[k]+(f[i]+v-f[k]-C)^2\\ dp[j]+(f[i]-f[j]-C)^2+2\cdot v\cdot (f[i]-f[j]-C)+v^2&\gt&dp[k]+(f[i]-f[k]-C)^2+2\cdot v\cdot (f[i]-f[k]-C)+v^2\\ \end{eqnarray*}
由[1][1]我们得到
(f[i]−f[j]−C)f[k]>>(f[i]−f[k]−C)f[j]\begin{eqnarray*}(f[i]-f[j]-C)&\gt&(f[i]-f[k]-C)\\ f[k]&\gt&f[j]\end{eqnarray*}
显然f[i]f[i]单调递增且k>jk>j,那么假设[1][1]成立
dp[j]+(f[i]−f[j]−C)2>dp[k]+(f[i]−f[k]−C)2\begin{eqnarray*}dp[j]+(f[i]-f[j]-C)^2&\gt&dp[k]+(f[i]-f[k]-C)^2\end{eqnarray*}
我们将其展开可得
dp[j]+f[i]2+(f[j]+C)2−2⋅f[i]⋅(f[j]+C)dp[j]+(f[j]+C)2−dp[k]−(f[k]+C)2>>dp[k]+f[i]2+(f[k]+C)2−2⋅f[i]⋅(f[k]+C)2⋅f[i]⋅(f[j]−f[k])\begin{eqnarray*}dp[j]+f[i]^2+(f[j]+C)^2-2\cdot f[i]\cdot (f[j]+C)&\gt&dp[k]+f[i]^2+(f[k]+C)^2-2\cdot f[i]\cdot (f[k]+C)\\dp[j]+(f[j]+C)^2-dp[k]-(f[k]+C)^2&\gt&2\cdot f[i]\cdot (f[j]-f[k])\\\end{eqnarray*}
dp[j]−dp[k]+(f[j]+C)2−(f[k]+C)22(f[j]−f[k])<f[i]\begin{eqnarray*}\frac{dp[j]-dp[k]+(f[j]+C)^2-(f[k]+C)^2}{2(f[j]-f[k])}&\lt&f[i]\end{eqnarray*}
所以我们得到斜率x(j,k)x(j,k)x(j,k)=dp[j]−dp[k]+(f[j]+C)2−(f[k]+C)22(f[j]−f[k])\begin{eqnarray*}x(j,k)=\frac{dp[j]-dp[k]+(f[j]+C)^2-(f[k]+C)^2}{2(f[j]-f[k])}\end{eqnarray*}
有x(j,k)<f[i]有x(j,k)\lt f[i]
所以当j<k且x(j,k)<f[i]j\lt k且x(j,k)\lt f[i]时,我们可以O(1)O(1)判断k比j更优,同时我们发现它的两个条件满足单调队列优化的性质k比j更优,同时我们发现它的两个条件满足单调队列优化的性质
时间复杂度为O(N2)O(N^2)
我们定义f[i]=sum[i]+i,C=L+1f[i]=sum[i]+i,C=L+1,那么上式转变成dp[i]=min{dp[j]+(f[i]−f[j]−C)2,dp[i]} (0≤j<i)dp[i]=min\{dp[j]+(f[i]-f[j]-C)^2,dp[i]\}~~(0\le j
然后我们来证明决策的单调性
假设在ii处有两个决策点j,k(j<k)j,k(j,且kk的决策比jj好
即要证明dp[j]+(f[i]−f[j]−C)2>dp[k]+(f[i]−f[k]−C)2——————[1]\begin{eqnarray*}dp[j]+(f[i]-f[j]-C)^2&\gt&dp[k]+(f[i]-f[k]-C)^2——————[1]\end{eqnarray*}
假设i后面的某状态t有f[t]=f[i]+v (t>i)假设i后面的某状态t有f[t]=f[i]+v~~(t>i)
我们想知道ii对于后面状态tt的影响,那么要证明
dp[j]+(f[t]−f[j]−C)2dp[j]+(f[i]+v−f[j]−C)2dp[j]+(f[i]−f[j]−C)2+2⋅v⋅(f[i]−f[j]−C)+v2>>>dp[k]+(f[t]−f[k]−C)2dp[k]+(f[i]+v−f[k]−C)2dp[k]+(f[i]−f[k]−C)2+2⋅v⋅(f[i]−f[k]−C)+v2\begin{eqnarray*}dp[j]+(f[t]-f[j]-C)^2&\gt&dp[k]+(f[t]-f[k]-C)^2\\ dp[j]+(f[i]+v-f[j]-C)^2&\gt&dp[k]+(f[i]+v-f[k]-C)^2\\ dp[j]+(f[i]-f[j]-C)^2+2\cdot v\cdot (f[i]-f[j]-C)+v^2&\gt&dp[k]+(f[i]-f[k]-C)^2+2\cdot v\cdot (f[i]-f[k]-C)+v^2\\ \end{eqnarray*}
由[1][1]我们得到
(f[i]−f[j]−C)f[k]>>(f[i]−f[k]−C)f[j]\begin{eqnarray*}(f[i]-f[j]-C)&\gt&(f[i]-f[k]-C)\\ f[k]&\gt&f[j]\end{eqnarray*}
显然f[i]f[i]单调递增且k>jk>j,那么假设[1][1]成立
dp[j]+(f[i]−f[j]−C)2>dp[k]+(f[i]−f[k]−C)2\begin{eqnarray*}dp[j]+(f[i]-f[j]-C)^2&\gt&dp[k]+(f[i]-f[k]-C)^2\end{eqnarray*}
我们将其展开可得
dp[j]+f[i]2+(f[j]+C)2−2⋅f[i]⋅(f[j]+C)dp[j]+(f[j]+C)2−dp[k]−(f[k]+C)2>>dp[k]+f[i]2+(f[k]+C)2−2⋅f[i]⋅(f[k]+C)2⋅f[i]⋅(f[j]−f[k])\begin{eqnarray*}dp[j]+f[i]^2+(f[j]+C)^2-2\cdot f[i]\cdot (f[j]+C)&\gt&dp[k]+f[i]^2+(f[k]+C)^2-2\cdot f[i]\cdot (f[k]+C)\\dp[j]+(f[j]+C)^2-dp[k]-(f[k]+C)^2&\gt&2\cdot f[i]\cdot (f[j]-f[k])\\\end{eqnarray*}
dp[j]−dp[k]+(f[j]+C)2−(f[k]+C)22(f[j]−f[k])<f[i]\begin{eqnarray*}\frac{dp[j]-dp[k]+(f[j]+C)^2-(f[k]+C)^2}{2(f[j]-f[k])}&\lt&f[i]\end{eqnarray*}
所以我们得到斜率x(j,k)x(j,k)x(j,k)=dp[j]−dp[k]+(f[j]+C)2−(f[k]+C)22(f[j]−f[k])\begin{eqnarray*}x(j,k)=\frac{dp[j]-dp[k]+(f[j]+C)^2-(f[k]+C)^2}{2(f[j]-f[k])}\end{eqnarray*}
有x(j,k)<f[i]有x(j,k)\lt f[i]
所以当j<k且x(j,k)<f[i]j\lt k且x(j,k)\lt f[i]时,我们可以O(1)O(1)判断k比j更优,同时我们发现它的两个条件满足单调队列优化的性质k比j更优,同时我们发现它的两个条件满足单调队列优化的性质
const maxn=50005; var sum,f,t,dp,x:array[0..maxn]of int64; q:array[0..2*maxn]of longint; i,j,k:longint; n,l,head,tail,tt:longint; c:int64; function g(a,b:longint):real; var d:real; begin d:=(dp[a]-dp[b]+(f[a]+c)*(f[a]+c)-(f[b]+c)*(f[b]+c))/(2.0*(f[a]-f[b])); exit(d); end; begin readln(n,l); sum[0]:=0; c:=l+1; for i:=1 to n do begin readln(x[i]); sum[i]:=sum[i-1]+x[i]; f[i]:=sum[i]+i; end; q[1]:=0; dp[0]:=0; head:=1; tail:=1; for i:=1 to n do begin while (head<tail)and(g(q[head],q[head+1])<=f[i]) do inc(head); tt:=q[head]; dp[i]:=dp[tt]+(f[i]-f[tt]-c)*(f[i]-f[tt]-c); while (head<tail)and(g(q[tail-1],q[tail])>g(q[tail],i)) do dec(tail); inc(tail); q[tail]:=i; end; writeln(dp ); end.
相关文章推荐
- hbase跨版本导数
- Qt头文件包含问题
- LeetCode --- House Robber & House Robber II
- 数据分页处理系列之二:HBase表数据分页处理
- iOS二维码的生成与识别
- 转战Android Studio 二
- 模板双向链表
- win8.1系统电脑如何开启远程登录服务?win8.1系统开启远程登录服务的设置教程
- 用eclipse进行系统开发资料整理
- Android开发笔记(二十)顶部导航栏ActionBar
- 迅为4412开发板平台-嵌入式开源平台
- ttttest
- iTunes store operation failed: You are not authoried to use this service
- 登入过程分析
- [Business Intelligence] BI & Decision Making
- 漫谈iOS RSA非对称加密与解密
- Android中线程同步之Mutex与Condtion的用法
- XML
- leetcode -- Number of Digit One -- 数学题,找规律
- 内核启动信息中NET: Registered protocol family 31