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

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

题目描述

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

相关推荐
徐某人..10 分钟前
基于i.MX6ULL平台的智能网关系统开发
arm开发·c++·单片机·qt·物联网·学习·arm
无敌秋1 小时前
# C++ 简单工厂模式实战指南
c++·简单工厂模式
code_pgf1 小时前
Octo 算法详解-开源通用机器人策略模型技术报告
算法·机器人·开源
cany10001 小时前
C++ -- 模板的声明和定义
开发语言·c++
澈2071 小时前
深耕进阶 Day1:C 与 C++ 核心差异 + C++ 入门基石
c语言·开发语言·c++
嘻嘻哈哈樱桃1 小时前
牛客经典101题题解集--动态规划
java·数据结构·python·算法·职场和发展·动态规划
脱氧核糖核酸__1 小时前
LeetCode热题100——234.回文链表(两种解法)
c++·算法·leetcode·链表
IronMurphy1 小时前
【算法四十二】118. 杨辉三角 198. 打家劫舍
算法
电科一班林耿超1 小时前
第 16 课:动态规划专题(二)—— 子序列与子数组问题:面试最高频的 DP 题型
数据结构·算法·动态规划
愚者游世2 小时前
noexcept 说明符与 noexcept运算符各版本异同
开发语言·c++·程序人生·面试·visual studio