「不会」二维凸包

    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$,

      于是这题变成了购票的弱化版

原文地址:https://www.cnblogs.com/yxsplayxs/p/12166560.html