闵可夫斯基和、需存储的最小状态集

以模拟赛遇到的一道题目为例

题目描述

给定一棵有 (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。

相关推荐
CoovallyAIHub2 小时前
颠覆认知!遥感船舶检测“越深越好”是误区?LiM-YOLO证明“少即是多”
深度学习·算法·计算机视觉
byzh_rc2 小时前
[算法设计与分析-从入门到入土] 贪心算法
算法·动态规划
Felven2 小时前
C. Contrast Value
c语言·开发语言·算法
natide2 小时前
表示/嵌入差异-1-欧几里得距离(Euclidean Distance)-L2 距离(L2 distance)-欧式距离的标准化
人工智能·pytorch·python·深度学习·算法·自然语言处理
雪花desu2 小时前
【Hot100-Java简单】:两数之和 (Two Sum) —— 从暴力枚举到哈希表的思维跃迁
java·数据结构·算法·leetcode·哈希表
qzhqbb2 小时前
群智能计算核心算法全解析
人工智能·算法
leaves falling2 小时前
c语言打印闰年
java·c语言·算法
YGGP2 小时前
【Golang】LeetCode 121. 买卖股票的最佳时机
算法·leetcode
驱动男孩2 小时前
c++新特性- 个人总结
c++·c++新特性