凸包学习笔记

凸包

一般通过证明或观察出斜率有单调性于是可以用凸包维护。

P5155 [USACO18DEC]Balance Beam P

题意:有长为\(n\)的序列,每次等概率向左右移动一格,也可以结束并获得当前位置上的值,求每个位置的最大期望收益。

思路:完全不懂期望!

首先有一个结论,在\([0,L]\)上的\(x\)处,每次等概率向两边走,走到\(0,L\)就停下,最终走到\(0\)的概率是\(\dfrac{L-x}{L}\),到达\(L\)的概率是\(\dfrac{x}{L}\)。证明的话,设\(f_i\)为在\(i\)处最终到达\(L\)的概率,那么有\(f_i=\dfrac{f_{i-1}+f_{i+1}}{2}\),这意味着这是等差数列,而又有\(f_0=0,f_L=1\),于是就可以推出刚才的结论。

接着再来看这道题,我们可以发现,最优策略肯定是在一个位置左右各选择一个停止点,到这个点就停止,我们把这些点成为停止点,现在问题就是选择哪些点作为停止点。假设当前在位置\(i\),左右的停止点是\(a,b\),那么期望就是\(v_a\times\dfrac{b-i}{b-a}+v_b\times\dfrac{i-a}{b-a}\)。这样还是不够具体。我们把\((i,v_i)\)当场一个点放在二维平面上,那么\(v_a\times\dfrac{b-i}{b-a}+v_b\times\dfrac{i-a}{b-a}\)就对应线段\(AB\)\(x=i\)的交点的纵坐标,而最大的期望就是所有交点中最高的一个,而这样的线段一定在凸包上,于是我们求出凸包就可以了。

P3309 [SDOI2014] 向量集

题意:加向量,求区间中的向量和询问给出的向量的点积的最大值。

思路:线段树维护凸包。

可以把答案变形为\(\dfrac{ans}{y_0}=\max\{\dfrac{x_0}{y_0}x+y\}\),发现最优答案肯定值在凸包上取到,于是维护上、下凸包即可。因为是在线的,因此对于一个区间,只有这个区间的所有线段都被加进来后才会求出这个区间的凸包,这样才能保证复杂度。

P5416 [CTSC2016] 时空旅行

思路:首先,\(y,z\) 这两是可以不要的,问题就变成了求 \(\min\{(x-x_i)^2+c_i\}\),即 \(\min\{x^2-2xx_i+x^2_i+c_i\}\),发现这就是斜率优化,可以写为 \(2xx_i+k=x^2+x^2_i+c_i\),于是维护凸包后每次找最后一个斜率不大于\(2x\)的线段就可以了。但是这道题不能直接求出每条线出现的区间,不过可以用dfn序(类似NOI2014购票)来处理。

还有询问的问题。我们可以把所有询问按 \(x\) 排序,这样每次的最优线段一定在之前的最优线段之后,可以对每个区间同时维护当前最优线段,然后只需考虑右移的贡献。

P9521 [JOISC2022] 京都观光

思路:考虑有行 \(x<y<z\),列 \(l<r\),那么有三种方式:

  1. \((x,l)\rightarrow(x,r)\rightarrow(z,r)\),代价 \((r-l)a_x+(z-x)b_r\)
  2. \((x,l)\rightarrow(z,l)\rightarrow(z,r)\),代价 \((r-l)a_z+(z-x)b_l\)
  3. \((x,l)\rightarrow(y,l)\rightarrow(y,r)\rightarrow(z,r)\),代价 \((r-l)a_y+(y-x)b_x+(z-y)b_y\)

如果经过 \(y\) 更优,那么有 \(\dfrac{a_y-a_x}{y-x}<\dfrac{b_r-b_l}{r-l}<\dfrac{a_z-a_y}{z-y}\)

同理,考虑何时向下何时向右,那么有 \(\dfrac{b_r-b_l}{r-l}<\dfrac{a_z-a_x}{z-x}\) 时往下走。

发现就相当于要维护下凸壳。于是维护下凸壳就可以了。

posted @ 2024-02-13 12:02  Xttttr  阅读(4)  评论(0编辑  收藏  举报