模型
大概就是,对于一类问题,可以用 $O(n^2)$ 预处理并 $O(1)$ 查询,或者用 $O(n)$ 处理每个询问,复杂度都是 $O(n^2)$ 数量级
此时可以通过预处理前 $\sqrt{N}$ 的部分,并对 $\sqrt{N}\sim N$ 的部分暴力以达到 $O(N\sqrt{N})$ 的复杂度
这跟筛法的思路相近
例题
P5901 [IOI2009]regions
有 $n$ 位委员,第 $1$ 个资历最高,委员所属的地区为 $1\sim R$ ,除第一个以外的所有委员都有一个直接导师,任何直接导师的资历高于其指导的委员,给定两个地区 $r_1,r_2$ ,要求回答有多少对委员 $e_1,e_2$ 满足 $e_1\in r_1,e_2\in r_2$ ,且 $e_1$ 是 $e_2$ 的导师
这个题有一个很好的启示:针对询问地区的大小设计不同的算法
不妨设 $r_1$ 中的点有 $A$ 个 $x_1,x_2,…,x_A$ ,$r_2$ 中的点有 $B$ 个 $y_1,y_2,…,y_B$
如果 $A$ 不大而 $B$ 很大
那么可以接受扫描 $A$ 而不能扫描 $B$
考虑 $dfs$ 序,$A$ 中每个节点的子树在 $dfs$ 序中都对应一段区间 $[l_A,r_A]$ ,而若 $y$ 是 $x$ 的子节点当且仅当 $l_x\leq l_y \And r_x\geq r_y \Leftrightarrow l_x\leq l_y \And r_x\geq l_y$
那么枚举每个以 $x$ 为根的子树,$dfs$ 序按 $l_i$ 排序,二分
用 $lower_bound$ 容易实现,复杂度 $O(A\log B)$
$A$ 很大而 $B$ 不大
上面启示我们应该设计一个 $O(B\log A)$ 的算法
也就是找到多少区间 $[l_x,r_x]$ 包含 $l_y$
仍可以用 $\text{lower_bound}$ 实现
$A$ 很大且 $B$ 很大
此时只能有无法优化的 $O(A+B)$ ,但考虑一个涉及很多点的询问不会出现多次,对于重复出现记忆化即可
具体的,当有 $y$ 满足 $l_y\in[l_x,r_y]$ 时表明前面的 $l_x,r_x$ 已经没用了,那么考虑尺取,对于每一个 $y$ ,找在当前 $x$ 之后的 $x$ 以累加答案
嗯,玄学证明
而对于不同复杂度的算法选取,论文给出的答案是 $lim=\sqrt{N\log N}$ ,但这里使用动态分析复杂度
开 $O(2)$ 才苟过的屑代码
1 | const int N=26100; |
CF1039D You Are Given a Tree
$n$ 个节点的数,其中一个简单路径的集合被称为 $k合法$ 当且仅当树的每个节点至多属于其中一条路径且每条路径恰好包含 $k$ 个点 $\qquad$ 对于 $k\in[1,n]$ 求 $k合法$ 路径集合的最多路径数,即,设 $k合法$路径集合为 $S$ ,求 $\max|S|$
显然能对于每个 $k$ ,在 $O(n)$ 内贪心出最长链
可以发现,随着 $k$ 的增大答案变小,在 $k>\sqrt{n}$ 的情况下,答案取值至多有 $\sqrt{n}$ 种
那么,对于 $k\sqrt{n}$ 的部分,暴力即可
剩下的部分二分求相同的值,至多 $O(\log n)$
可以再考虑分治的优化:设分治点 $T$ ,有 $O(nT+\frac{n^2\log n}{T})$
考虑两项相乘为定值,那么当两者相等,即 $T=\sqrt{n\log n}$ 时,有最优复杂度
1 |
|