考虑 dp,设 fuf_u 为喂饱 uu 子树所需的最小次数。对于叶子,令 fu=auf_u = a_u;对于有两个儿子 v0,v1v_0, v_1 的非叶子,fu=2max(fv0,fv1)[fv0fv1]f_u = 2\max(f_{v_0}, f_{v_1}) - [f_{v_0} \ne f_{v_1}],因为两边次数不相等时,我们可以先操作需要次数更多的。

假设 gu=fu1g_u = f_u - 1,则转移变为 gu=2max(gv0,gv1)+[gv0=gv1]g_u = 2\max(g_{v_0}, g_{v_1}) + [g_{v_0} = g_{v_1}]。令 depudep_u 表示 uu 的深度(dep1=0dep_1 = 0),Fu=gu×2depuF_u = g_u \times 2^{dep_u},那么 f1=F1+1,Fu=max(Fv0,Fv1)+2depu[Fv0=Fv1]f_1 = F_1 + 1, F_u = \max(F_{v_0}, F_{v_1}) + 2^{dep_u}[F_{v_0} = F_{v_1}]

可以发现一个性质:FuF_u 的二进制表示最多包含 log2nA\log_2 nA11A=maxaiA = \max a_i)。通过归纳法证明:假设可以导致 FuF_ukk11 的树的最小大小为 d(k)d(k) . 那么,当 klog2Ak \le \log_2 A 时,d(k)=1d(k) = 1;否则,d(k)2d(k1)d(k) \ge 2d(k - 1),因为 Fv0=Fv1F_{v_0} = F_{v_1} 时才会出现新的 11

维护一个由二元组 (u,x)(u, x) 组成的集合 SS,其中 xxFuF_u 的一个下界。最初,将所有满足 au>0a_u > 0 的叶子 uu 的二元组 (v,2depu(au1))(v, 2^{dep_u}(a_u - 1)) 放入 SS,如果 SS 中同时存在 (p,x)(p, x)(q,x)(q, x)pqp \ne q),则将 (r,x+2depr)(r, x + 2^{dep_r}) 放入 SS,其中 r=LCA(p,q)r = \text{LCA}(p, q),且 2depr2^{dep_r} 一定是一个新位(即加法一定不会发生进位)。

这样做为什么是正确的?考虑证明一个点的实际值一定不小于它的任何一个下界。对于任意一个 pp 的祖先 oo(对于 qq 同理),显然有 FoFpF_o \ge F_p,则 xFp,FqFrx \le F_p, F_q \le F_r;若存在一个点 zzprp \to r 转移的路径上,满足 Fz>FpF_z > F_p,那么 FzF_z 的一个下界是 Fp+2depzFp+2deprF_p + 2^{dep_z} \ge F_p + 2^{dep_r},因为 depzdeprdep_z \ge dep_r

那么答案是 SS 中所有数对中最大的 x+1x + 1(如果 SS 是空的,答案显然是 00)。

具体维护的时候,每当加入一个二元组 (u,x)(u, x) 时,我们只需要考虑 xx 相同,且 uu 与其 dfs 序相邻的两个 uu,这样才能使其深度最大。设它们分别为 p,qp, q,则我们要考虑 y=LCA(u,p),z=LCA(u,q)y = \text{LCA}(u, p), z = \text{LCA}(u, q) 两个点,在这两者中取深度更大者,因为深度小的一定是深度大的的祖先,不需要考虑。设 depydepzdep_y \ge dep_z,则我们加入 (y,x+2depy)(y, x + 2^{dep_y}),并重复上一流程。若找不到任意一个 yy 就跳出。

因为位数不超过 log2nA\log_2 nA,所以一次加入操作最多会插入 log2nA\log_2 nA 个二元组,如果我们使用 std::vector<int> 维护有 11 的所有位置,并用 std::set 维护二元组,则 std::set 的时间复杂度是 O(lognlog2nA)O(\log n \log_2 nA)。共操作 O(log2nA)O(\log_2 nA) 次,则单次加入或删除的时间复杂度为 O(lognlog22nA)O(\log n \log_2^2 nA)。若要更改 aua_u,只需从 SS 中删除旧的 aua_u 所更新到的顶点对(类似于添加),然后添加新的 aua_u 所更新到的顶点对。总时间复杂度 O((n+q)lognlog22nA)O((n + q) \log n \log_2^2 nA),不知道为什么可以通过。

code