Processing math: 100%

[LibreOJ 2249][NOI2014]购票

在紧张刺激的等待之后终于肝掉了这道题……

本题的DP方程长成这样(其中av的某个满足距离限制的祖先,dvv到根的路径长):

fv=min(fa+pv(dvda)+qv)

化简之后发现:

fv=qv+pvdv+min(fapvda)

利用min中那一块很容易发现是截距式……但是问题在于,我们的转移来源是树上的连续一段祖先,怎样维护他们的凸包?

答案很狂暴啊……用树链剖分套上向量集那题的线段树套凸包,然后完了……

(注意一点细节:本题因为数据范围过大,故可能存在两个向量叉乘爆long long,所以在求凸包时如果直接用叉积判断是否需要删点会炸掉,建议用斜率判断)

代码:

[LibreOJ 2353][NOI2007]货币兑换

emmm做了一下这道神题……(我可能是少有的用动态凸包苟的?

首先DP方程长这样:

fi=max(fi1,fjAiRj+BiAjRj+Bj)

然后这个方程炒鸡复杂……首先fi1不要管了,然后设ai=fiAiRi+Bi。在xjb推了一番之后我们终于得到了截距式……

ajRjAiBi+fiBi=aj

但是这玩意太毒瘤了……斜率不可能单调的,这还好,在凸壳上二分/三分一下即可。但问题在于,横坐标也不单调……

这个时候就需要动态维护凸包了(其实是我不会CDQ),我直接把我向量集那题的二进制分组线段树搬了过来……(逃

代码:

[LibreOJ 2035][SDOI2016]征途

又做了一道适合我这种沙茶做的题qwq

考虑方差,它满足这个式子:

Var(X)=E[X2](E[X])2

对于这个题展开,发现后半部分是一个常量((snm)2)。最小化的就是前半部分,前半部分相当于要求你求一个序列划分,使得各部分平方和的平均值最小。这个值乘上m2之后就变成了各部分平方和乘上m

然后就很简单了……DP方程化简之后是这样的:

ft,i=ms2i+max(ft1,j+ms2j2msisj)

求截距式形式,得:

2msisj+di=fj+ms2j

然后用类似于上上题的方法搞就行。还有我想想啥时候补一下斜率优化的tutorial……

代码:

[BZOJ 3156]防御准备

又做了一个简单的斜率优化题TAT

首先,设fi表示最后一个放塔的点事i时的最优解,那么将原方程化简得:

fi=ai+i2i2+max(ij+j2+j2+fj)

然后求直线形式,得到:

ij+di=fj+j2+j2

用类似于玩具装箱(上一篇题解)的方式搞一搞即可。

代码:

[BZOJ 1010][HNOI2008]玩具装箱toy

很久之前是学过并写过斜率优化的……但是很快就忘了。现在感觉自己理解了,感觉是真的懂了……抽空写篇文章解释一下吧……

先单独说这一个题。将DP方程完全展开,并且设Pi=Si+ic=L+1,可得:

fi=c2+P2i2Pic+max(P2j+2Pjc+fj2PiPj)

然后c2+P2i2Pic这部分是常数项不需要管了,我们就想想max里面那些(姑且设之为di)咋整好了。

di=P2j+2Pjc+fj2PiPj,稍作移项,得:

2PiPj+di=P2j+2Pjc+fj

于是乎,di可以看做斜率为2Pi的直线过点(Pj,P2j+2Pjc+fj)得到的截距。而那些点我们之前都知道了,问题就变成了已知斜率,求过某点集中的点的最大截距。

想象一个固定斜率的直线从下往上扫,那么碰到的第一个点就是最优解。首先这个点一定在下凸壳上,其次下凸壳上这点两侧的线段的斜率肯定一个比2Pi大另一个比它小。并且最好的一点是这个斜率还是单调的,那么分界点一定是单调递增的。

代码: