以模拟赛遇到的一道题目为例
题目描述
给定一棵有 (N)( N )(N) 个顶点的树,顶点编号从 111 到 (N)( N )(N)。树带有顶点权重,即每个顶点被赋予一个非负整数值的权重。
我们将从树中删除若干条边。删除边后,要求每个连通分量中顶点权重之和均在区间 ([L,R])([L, R])([L,R]) 内。
对于所有满足 (0≤i≤K)(0 \leq i \leq K)(0≤i≤K) 的整数 (i)(i)(i),判断是否恰好删除 (i)(i)(i) 条边能达到上述目标。
输入格式
第一行一个正整数 (T)(T)(T) 表示数据组数。
每组数据的第一个行四个整数 (N,K,L,R)(N, K, L, R)(N,K,L,R)。
每组数据的第二行 (N)(N)(N) 个整数 (A1,A2,⋯ ,AN)(A_1, A_2, \cdots, A_N)(A1,A2,⋯,AN) 表示顶点的权重。
接下来 (N−1)(N - 1)(N−1) 行,每行两个整数 (Xi,Yi)(X_i, Y_i)(Xi,Yi) 表示树的一条边。
输出格式
共 (T)(T)(T) 行。
对于每组数据,输出一行一个长度为 (K+1)(K + 1)(K+1) 的 01 字符串,其中,若删除 (i−1)(i - 1)(i−1) 条边能满足目标,则第 (i)(i)(i) 个字符为 111,否则第 (i)(i)(i) 个字符为 000。
本道题中 N,KN, KN,K是较小的正整数。
在推导过程中,不难描述状态转移为 dp[u][i][wu] 意为 uuu 目前的子树分为 iii 个连通块,此时与 uuu 相连的点的点权和为 wuwuwu 时候是否是可行的构造。
如此构造的时间复杂度是 O(nk2R2)O(n k^2 R^2)O(nk2R2)的,注意到在进行树dp时候 kkk 的上界是跑不满的,所以时间复杂度在 n==100n == 100n==100 时,可以视作 O(nkR2)O(nkR^2)O(nkR2) 的。这也是赛时推出来的全部了。
之后,我们发现,由于 RRR 非常的大 (1018)(10^{18})(1018) 级别,所以我们不妨将状态改为 dp[u][i] 意为将 uuu 的子树分为 iii 个连通块,能构造出哪些可行的 wuwuwu,我们将 wuwuwu 存进这个堆中用 set 去重后,运气很好的跑到了 70 pts70 \ pts70 pts。
其实,这已经是一个很好的发现了,有效的状态数不多。那该如何理解 有效的状态数呢,就需要推一下本道题了。
由 u的当前子树 和 v子树 进行合并的过程 wu + wv,我们可以考虑成凸包中的闵可夫斯基和,那么新生成的状态可以理解为 "u集合"和"v集合"的闵可夫斯基和。
存储全部的状态是指数级别的,现在考虑由该问题的有效状态与冗余状态进行分析。
考虑 uuu 子树其中一个状态 (i,wu)(i, wu)(i,wu),即已经切了 iii 个割边,此时与 uuu 相连的点的点权和为 wuwuwu 。那么,如果最后要切 KKK 个割边的话,我们在未来还需要切 K−iK - iK−i 个割边;同时,不妨假设剩余总和的点权和为 SSS。
那么,想让每个连通块的点权和在 [L,R][L, R][L,R] 内,就必须满足以下必要条件:
(K−i+1)×L≤S+wu≤(K−i+1)×R(K-i+1) \times L \leq S + wu \leq (K-i+1) \times R(K−i+1)×L≤S+wu≤(K−i+1)×R
在上式中,因为还需要切 (K−i)(K-i)(K−i) 个割边,所以就会生成 (K−i+1)(K-i+1)(K−i+1) 个连通块,每个连通块需要满足权值和条件,而剩余总量为 S+wuS + wuS+wu。
我们要关注的是 wuwuwu 是否有必要存储
指的是,我们假设 F(u)F(u)F(u) 为 uuu 存储的状态,有 (i′,wu′)(i', wu')(i′,wu′)(wu′∈[L,R])(wu' \in [L, R])(wu′∈[L,R]) 是未来将要拼上的部分,而对于式子 F(u)+(i′,wu′)F(u) + {(i', wu')}F(u)+(i′,wu′)(闵可夫斯基和) 的 F(u)F(u)F(u) 中存在的 (i,wu)(i, wu)(i,wu) 的删去不会影响最终的答案,那么 (i,wu){(i, wu)}(i,wu) 就可以被删去。
我们可以这么思考,如果删去 (i,wu)(i, wu)(i,wu) ,是不是应该有 (i,wu−)(i, wu^-)(i,wu−) 和 (i,wu+)(i, wu^+)(i,wu+) 存在,不然 (i,wu)(i, wu)(i,wu) 作为某个边界条件应该是会发挥作用的。 wu−wu^-wu− 指代小于等于 wuwuwu 的值,同理 wu+wu^+wu+。
wu−<wu<wu+wu^- < wu < wu^+wu−<wu<wu+ (不必考虑相等,相等必只保留一个)
通过作图法可以发现,在 wu+−wu−≤R−Lwu^+ - wu^- \leq R - Lwu+−wu−≤R−L 时,对于 (i,wu)(i, wu)(i,wu) 和 (i′,wu′)(i', wu')(i′,wu′) 的拼接 (i+i′,wu+wu′)(i + i', wu + wu')(i+i′,wu+wu′) ,如果满足 wu+wu′∈[L,R]wu + wu' \in [L, R]wu+wu′∈[L,R],则,我们观察能否由 wu−wu^-wu− 和 wu+wu^+wu+ 取代 wuwuwu。
Δ−=wu−wu−,Δ+=wu+−wu\Delta^- = wu - wu^-, \Delta^+ = wu^+ - wuΔ−=wu−wu−,Δ+=wu+−wu
wu−:wu−+wu′∈[L−Δ−,R−Δ−]wu^- : wu^- + wu' \in [L - \Delta^-, R - \Delta^-]wu−:wu−+wu′∈[L−Δ−,R−Δ−]
wu+:wu++wu′∈[L+Δ+,R+Δ+]wu^+ : wu^+ + wu' \in [L + \Delta^+, R + \Delta^+]wu+:wu++wu′∈[L+Δ+,R+Δ+]
由于有 wu+−wu−≤R−Lwu^+ - wu^- \leq R - Lwu+−wu−≤R−L,则 wu−wu^-wu− 和 wu+wu^+wu+ 至少有一个满足。
因此,删掉这样的 (i,wu)(i, wu)(i,wu) 不会影响答案的正确性。
综上,我们发现对于 uuu 子树内割边为 iii 的情况,我们需要保留的 wuwuwu 是有限的。由 (K−i+1)×L≤S+wu≤(K−i+1)×R(K-i+1) \times L \leq S + wu \leq (K-i+1) \times R(K−i+1)×L≤S+wu≤(K−i+1)×R 发现,$(K−i+1)×L≤S+wu≤(K−i+1)×R⇒wu≤(K−i+1)×(R−L)(K-i+1) \times L \leq S + wu \leq (K-i+1) \times R \Rightarrow wu \leq (K - i + 1) \times (R-L)(K−i+1)×L≤S+wu≤(K−i+1)×R⇒wu≤(K−i+1)×(R−L)。
每个长为 (R−L)(R-L)(R−L) 的子区间内,有效的 wuwuwu 只有至多 222 个。所以,在每个 (u,i)(u, i)(u,i) 所对应的 wuwuwu 状态数只需要存储 O(K−i+1)O(K - i + 1)O(K−i+1) 级别。
于是,我们可以根据以上的性质完成本题了。
注意,可以使用 vector<> 来存储 dp[u][i] 的 wuwuwu。