A.栞
考虑面积公式 \(S = \frac{1}{2} ab \sin C\),则 \(4S^2 = ab(1 - \cos^2C)\),则我固定 ab 的情况下,我要 \(\sinC\) 最大,也就是 cos 绝对值最小。
考虑定序,若令 \(a > b > c\) 那么 C 一定是锐角,那么就要令 c 最大;同理可知 b 也要最大,那么就得到了一个性质:abc 一定是相邻的三个数。
B. 路径交
这一看和概率并不很相关,考虑计数。也就是统计所有选取方案中重叠长度之和。
方法一:拆贡献
首先肯定想对于一个路径做操作,但不好做,我们考虑拆成和边相关,看每条边贡献给那些选取方案。
考虑那个期望的形式是一个 \(X^2\),那么如果有一条路径是 \({e_1, e_2.....e_k}\) 那么答案就是 \(\sum e_i^2 + \sum_{i \not= j}2e_i \times e_j\)。
对于一条边 \((u, v)\),那么第一部分的代价是: \(siz_v \times (n - siz_v)\)
如果记 \(siz_u\) 是子树大小,\(sum_u\) 是 u 子树内 \(siz^2\) 的和。
第二部分我们需要分讨一下,在这里我们只统计经过 u 的那些贡献:
- 如果另一条边在 v 子树内,那么答案是在 v 的子树内选一个点(不可以是 v),选择 v 到 \(fa_v\) 的那条边,然后继续往下延伸,因为两条边有顺序所以要乘二。然后两条路径要出去,所以要乘上 \((n - siz_v)^2\)。所以答案是 \(2 \times (sum_v - siz_v^2) \times (n - siz_v)^2\)。
- 如果在不同子树,那么两条路径一边在 v 内,一边 u 的除 v 外子树内,即为 \(sum_v \times (sum_u - sum_v - siz_u^2)\)。
方法二:LCA 处统计
其实很类似,但是我们考虑两条边 \((i, fa_i), (j, fa_j)\) 这两条边同时被经过的路径数量,因为这个点对有序,所以一条边刚好算一次。
如果 ij 没有祖先关系,那么就是分别两个子树内选,\(siz_i^2 siz_j^2\)。那么就是要统计 \(LCA(i, j) = u\) 的点对个数。
同样,如果记 \(siz_u\) 是子树大小,\(sum_u\) 是 u 子树内 \(siz^2\) 的和。
枚举 u,如果 v 是 u 的儿子,答案就是 \((\sum s_v)^2 - \sum s_v^2\)。
如果不妨令 i 是 j 的祖先(j 是 i 祖先是一样的,乘二即可),先判掉 i == j,答案就是 \(siz_v(n - siz_v)\)。
否则方案数是 \((n - siz_i) \times siz_j\),那么枚举 i,总贡献是 \(2(n - siz_i)^2(sum_i - siz_i^2)\)。
C.替换
二分后,从左往右确定,使得每个数在满足单调的条件下,跳 mid 步以内尽可能小。
一个很灵魂很厉害的转化是:令 \(X\) 是 \(a_{i - 1}\) 的最终值,我们只需要依次判断:从 \(a_i\) 开始能否通过至多 \(mid\) 次操作成 \(X + 1, X + 2, X + 3....\),这样尝试下去,直到尝试成功就停止,得到 \(a_i\) 的最终值。
那么问题转化为能否通过之多 mid 次操作变成一个点。
考虑这个跳的操作相当于是一个 m 个点的基环树,那么我就是跳 mid 步以内能否经过某一个点。
基环树也可以从另一个方向理解,就是一棵树然后从根上连下来一条边。那么我们如果能倒打一个点,要么他是我们的祖先,要么是环上的点。祖先直接按 dep 判断长度,否则看是否在环上,这个也是可以用 dep 做。
(时间不是很够,先咕掉了)
第 k 小 -> 二分