【A】计算几何 & DP
向量运算
- 点积 \((x_1,x_2,x_3,\dots)\cdot(y_1,y_2,y_3,\dots)=\sum_i x_iy_i\)。
- 叉积 \((x_1,y_1)\times (x_2,y_2)=x_1y_2-x_2y_1\)。
- \(A\times B=-B\times A\)。
旋转卡壳
平面最近点对
对一维进行分治,然后求出两边递归的最近点对距离 \(d\)。
考虑跨中线的贡献,发现直接每个点检查 \(d\) 为半径的正方形即可,因为这里面不会超过 \(O(1)\) 个点。
\(O(n\log n)\)。
最小圆覆盖
边界上至少有三个点。
P3829 [SHOI2012] 信用卡凸包
圆弧一定全算进凸包里头了,然后把直边的所有端点全部算一次凸包就好了。
P3260 [JLOI2014] 镜面通道
只要连通就能过,跑最小割。
P10651 [ROI 2017] 虎(征集交互库) (Day 1)
先在点集上二分一个凸包,现在我们知道隐藏点在一个凸包减去另一个凸包内,是一个月牙。
然后在月牙上二分一个前缀。如果是问了一个凹的点集直接变成凸包就好了。
最后可以确定到一个三角形内。
AT_agc044_e [AGC044E] Random Pawn
显然到达最大值就会退出,那么可以把 max 放到头尾。
你考虑你在 \(i\) 处开始的期望收益是 \(f_i\),我们有:
\(f_i=\begin{cases}A_i\\ \frac{1}{2}(f_{i-1}+f_{i+1})-B_i \end{cases}\)
两种选择。
令 \(C_i=\frac{1}{2}(C_{i-1}+C_{i+1})-B_i\),\(g_i=f_i-C_i\)。
有 \(g_i=\max(A_i-C_i,\frac{1}{2}(g_{i-1}+g_{i+1}))\)。
这就是直接对 \(A_i-C_i\) 建凸包。
- QOJ975 Game
简易版 LARSCH 算法
在线决策单调性 dp \(O(n\log n)\)。
令 \(f_i\) 表示 \(i\) 的 dp 值,\(op_i\) 表示 \(i\) 的决策点。
考虑分治 \([l,r]\),对 \(r\) 进行转移。流程如下:
- 先用 \(f_{op_l\sim op_r}\) 更新 \(f_{mid},op_{mid}\)。
- 递归分治 \([l,mid]\)。
- 用 \(f_{l\sim mid}\) 更新 \(f_r,op_r\)。
- 递归分治 \((mid,r]\)。
以前写的四种决策单调性 dp 形式 https://www.luogu.com.cn/article/95ahsmez
AT_dwango2016qual_e 花火
\(f_{i,j}=(\min_{k\le j} f_{i-1,k})+|p_i-j|\)。slope trick 维护。
CF280E Sequence Transformation
\(f_{i,j}=(\min_{j-b\le k\le j-a} f_{i-1,k})+(x_i-j)^2\)。
slope trick,维护函数平移和全局加一次函数。
P8439 Altale (Fan-made FTR 7)
根若不在环上:根的邻边可以割,代价为 1。
根若在环上:除了与根相连的环边,代价都是 1。与根相连的边可以看作花 1 的代价可以割掉最大子树,花 2 代价割掉两个与根相连的环边。
令这两种决策分别割掉了 \(x,y\) 个节点。
若 \(x\le y-x\),则可以拆成 \(x,y-x\) 两个代价为 1 的物品,直接排序贪心取。
剩下的就是 \(x>y-x\) 的。
按照两种决策性价比排序,代价为 2 的一定在前面。然后你类似 sale 一样,至多有一次反悔。排序换桶排就是 \(O(n)\) 的。
AT_abc355_g [ABC355G] Baseball
P9266 [PA 2022] Nawiasowe podziały
每段的代价 \(w\) 满足决策单调性,可以 wqs 二分。
然后内层做决策单调性分治,代价用莫队跑,做到 \(O(n\log ^2 n)\)。
浙公网安备 33010602011771号