凸包
一般形式是$y=k*x+z$,找到合适的$z$,于是维护一个凸包的点集。
一般不判斜率,而算叉积。
套路,斜率单调性或点集单峰性,数据结构瞎套一套就好了。
叉积如果暴long long,开long double
刷题表:
A. 陶陶的难题II:
要学一个东西叫01分数规划。
二分答案$ans\leq \frac{y_i+q_j}{x_i+p_j}$,然后变成判定问题。
化成$(y_i-ans*x_i)+(q_j-ans*p_j)\geq 0$,使$(x,y)$和$(p,j)$无关,分别凸包求最大值。
如果在序列上,可以线段树维护凸包,树上套个树链剖分。
二分一个,树链剖分两个,找到区间三分一个,一共四个$log$。。。
B. 旅行规划:
问题是维护区间查询前缀最大值,区间加。
用分块维护,对于每个块维护等差数列,在每个块内三分。
设首项为$fi$,公差为$se$。
$fi+se*(pos-l)+y=z$
$y=-fi-se*pos+se*l+z$
所以可以块维护凸包三分。
修改时对于边界暴扫的块再暴力重新建栈。
时间复杂度$O(n*sqrt(n)*log(n))$
C. 妖怪:
柿子:$\max({x+\frac{a*y}{b}+y+\frac{b*x}{a}})$
非正解(会被卡常):
设$t=\frac{a}{b}$
$x+y*t+y+\frac{x}{t}$
二分答案.
$(x+y-z)*t+y*t*t+x\leq 0$
变成高考数学,检验所有解集是否有交集即可。
正解:
对于每对$(x,y)$都是单峰函数,合起来也是单峰函数,就可以三分。
D. 向量集:
线段树维护凸包板子。
E. 防线修建:
动态维护凸包,可以写$set$
F. 货币兑换Cash:
首先提示的结论是可以证的,不太难想,如果当前决策是买券,那么一定要在之前的所有时刻尽可能多得把钱换成券。
然后$n^2dp$就有了。
然后可以$cdq$维护凸包,也可以$splay$二分斜率。
G. 购票:
$n^2dp$是比较好写的。
然后化完柿子发现可以维护凸包,但并不能只搞一个单调栈一遍$dfs$。
因为有个距离限制,某些已经被弹栈的点在距离限制下的点集中可能会在凸包上。
开始写树剖,注意线段树区间查询时要在区间全都合法的情况下再三分。