Boboqqq说,总结必须要写啊。
求静态凸包有两种方法,一种是按横坐标排序,
另一种是先选定一个起点,然后按其它点关于这个点的方向排序
前一种可以直接单调栈解决,但是一次只能跑出半个凸包,
后一种可以一次求出一个完整的闭合凸包
解决动态凸包问题有两种方法,一种是cdq分治+归并排序
另一种是平衡树二分斜率,用set其实很方便了就是慢
判断凸性的时候,一种方法是比较斜率
在第一象限没啥问题,但是到了别的象限就不是很对了
所以skyh教我向量叉乘,$a×b=ax*by-ay*bx$,矢量
在第一象限,它和$k_b-k_a$同号,所以也是很直观的工具
最大化一个表达式$f(i)$但其含有i和j的次数都不为0的项时,
应当考虑使用凸包(斜率优化)
$f(i)=f_1(i)+f_2(j)+f_3(i,j)$
第一项看作常数,则需要最大化第二三项,我们要维护出所有可能成为决策点的j
通过运作得到形式如下等式:$y(j)=k(i)*x(j)+b(i)$,其中要f与b有确定的符号关系
则可以通过最大/小化b来实现最大化f
将每个j表示为坐标上一个点$(x(j),y(j))$之后,
考虑所有情况下出现的i,决策点一定处于j的集合的凸包上,因为b体现于$(x,y)$的直线在y轴上的截距
然后维护这个凸包,每次询问i时用i的$k(i)$二分寻找最值
「旅行规划」
前缀和之后,修改操作变成了加上一个等差数列
对于一个被完全覆盖的区间$[L,R]$,原本求$Si$的最大值变为求$Si+(i-L+1)*q$,q为公差的最大值
为了保证复杂度,初始的$Si$不应是经常变动的,而应努力使不变$Si$的情况下也能对每个q维护出最值
$ans=max(Si+i*q) -> Si=-q*i-ans$,每次询问拿目前的q的相反数去凸包上找最小截距,找到的点即可用来更新ans
以及分块
「防线修建」
离线,题目帮忙省了一些边界的处理
「购票」
$f_i=f_j+p_i*(d_i-d_j)+q_i$,$f_j=(f_i-q_i-p_i*d_i)+p_i*d_j$
可以看出是斜率优化,如果是序列问题直接动态凸包就好了
可是是树上问题,所以加上一个链栈就好了,每次递归只会改变栈顶位置和该位置元素,
每次回溯改回去就行了
可是还有L的限制,所以用树状数组套单调栈,每次询问区间的并就行了
不会树状数组的话也可以点分治。。。
每棵分治树都统计重心及其父链对重心的所有儿子的子树的贡献,要先递归到父亲方向子树。
「货币兑换」
$f(i)=max(A_ia_j+B_ib_j)$
$b_j=-frac{A_i}{B_i}a_j+frac{f(i)}{B_i}$
「妖怪」
和货币兑换差不多,但是用动态凸包怎么也过不去,排序后用单调栈求凸包来才过了。
「陶陶的难题II」
为什么没想到在最外层二分答案搞01分数规划,一直想在最里层二分
不把xy和pq搞开就司路易条。
复杂度为$nlog线段树+m询问数*log二分答案*log^2节点*log凸包=nlog^4n$
「向量集」
$4e5 nlog^2n$能过$3s$,
于是这题变成了购票的弱化版