D1T3:求路径上编号最小值在端点上的点对 (u,v) 数量,考虑Floyd。考虑 f_{u,v,k} 为从 u 到 v 只经过编号 \geq k 的点是否可行,统计 f_{u,v,u} 或者 f_{u,v,v} 即可。对于修改操作,重新定义 f_{u,v,k} 为最小可行时间,即可一遍Floyd求出答案。
D2T1:将询问拆成向上的和向下的两部分,先考虑向上的。定义 nxt_{i,p} 为从 i 向上跳的第一个 p 属性点,然后倍增。我们只记录在 c 数组里的下一个 p,可以扫一遍树得出。然后考虑向下的。不难发现这个和向上的很像,想到将序列倒过来做一遍,但是我们并不知道右边会落在哪里,这时我们考虑二分。这里就牵扯到查询 nxt_{i,p},所以我们把询问离线,然后扫一遍树得出。
D2T2:先想朴素dp,考虑当前点集 S、最后一个人 i 以及 b_i、当前花费 j。转移到人 i'、花费 b'。复杂度 O(2^nn^2m^3)。不难发现对于一个顺序 p,其最小花费是固定的,而且转移在花费上单调,所以 b' 一维可以直接设为当前最小花费而不计入转移,复杂度 O(2^nn^2m^2)。接着我们发现,最小花费 b_i+\Delta b 中 \Delta b 仅与 i 和 j 有关。故考虑对 \Delta b 计算贡献,发现可行,复杂度 O(2^nn^2m)。