代码

A

.

B

因为 ,所以假设

完全在答案的精度范围内,可以忽略不计,也就是可以假设

直接解方程得

C

.

D

观察到 并不是很大,可以随便想想怎么做,往最短路方向去想,因为有 的限制,可以考虑下每次不休息一次就分一层图,最后一层只能强制往第一层走

就是分层图最短路

  • 每一层向下一层连边代表这个点不休息,代价为
  • 每一层点 向第一层点 连边代表这个点休息了一次,又可以重新计算未休息的点数,代价为

最后跑最短路就好了,需要特殊处理最后位置 的休息情况

E

看起来很像树的直径,因为要强制经过一个点,考虑换根 dp 解法的树的直径,设 分别表示从当前节点向子树的最长权值链和次长权值链,这样能够拼出来 一条跨过点 的链

还要考虑点 子树外的一些点对答案的贡献,设 表示 子树外,以 为起点的最长权值链,考虑这个怎么更新

套路的,我们用 来更新,如果 不是由 更新的,可以直接用 更新当前节点,否则只能用 更新,最后直接计算答案

F

E 没啥关系吧

需要找到树上一条链 其中 的排列,并且

首先给 的每个值都设一个 unsigned long long 的随机值 ,然后求前缀异或

可以考虑异或哈希,以 的某个儿子 为开头的一条链 的异或值为 ,且 ,并且存在不以 为根的一条链的异或值为 ,那就可以计入答案

G

F 的做法搬过来,点分治一下,每次以分治中心为根做一遍