凸包刷题总结

A. 陶陶的难题II

显然可以二分答案,设二分出来的答案是$k$

$$y_i+q_j=k*(x_i+p_j)$$

$$y_i-k*x_i=k*p_j-q_j$$

树剖+线段树上维护凸包即可

B. 旅行规划

考虑分块

对于每个块维护等差数列首项和公差以及不加等差数列的前缀和构成的凸包

每次查询因为凸包上斜率递减

所以可以二分出最后一个斜率大于公差的位置便是这个块对答案的最大贡献

C. 妖怪

答案函数张这样:

$$ans=k*A+B/k+A+B$$

二分答案很显然但是次数太多$A$不了

考虑这样一个函数:

$$f(x)=-k*x+k*A+B$$

发现$f$的横纵截距之和便是要求的答案

显然$ans$的最大值一定是取在$n$个点$(A,B)$构成的上凸包上

维护好凸包后枚举每个点作为最大值

因为

$$k*a+\frac{1}{k}*b>=2*\sqrt{ab}$$

此时

$$k=\sqrt{\frac{b}{a}}$$

枚举每个点作为最大值并算出斜率的范围用上面的式子求出最大值即可

D. 向量集

即给定$n$个点$(x,y)$

最大化

$$z=a*x+b*y$$

变一下形式

$$y=-\frac{a}{b}*x+\frac{z}{b}$$

用线段树维护凸包即可

E. 防线修建

$set$动态维护凸包的板子题

F. 货币兑换Cash

设$dp[i]$代表第$i$天全部卖出的最大收益,则有
$$dp[i]=max(dp[i-1],f[j]*a[i]+g[j]*b[i])$$
$$f[i]=dp[i]/(r[i]*a[i]+b[i])$$
$$g[i]=f[i]*r[i]$$
$set$维护动态凸包即可

G. 购票

$dp$+树剖维护凸包的裸题

套路原先都说过,不再赘述

posted @ 2020-01-08 17:02  ATHOSD  阅读(116)  评论(0编辑  收藏  举报