树上问题
文章平均质量分 55
bandiaoz_cjl
这个作者很懒,什么都没留下…
展开
-
牛客练习赛78 CCA的子树
CCA的子树 题意 一棵 nnn 个点的带权树,根节点为 111 。要求选出两个节点,两个节点子树没有交集,最大化两个节点的子树点权和,如果找不到合法的子树,输出Error。 题解 如果两个节点子树没有交集,那么必然可以向上找到两个兄弟节点,使得这两个节点分别是两棵子树根的祖先。 维护 b[u]b[u]b[u] 表示以 uuu 为根的子树中,可以找到的最大的子树权值和。 在遍历节点 uuu 的所有孩子节点的时候,维护答案等于这个孩子节点的 b[v]b[v]b[v] + 最大的兄弟节点 b[vv]b[vv]原创 2021-03-13 14:11:12 · 118 阅读 · 0 评论 -
牛客 Shortest Path 树形dp
牛客 Shortest Path 题意 一棵 n(保证n是偶数)n(保证n是偶数)n(保证n是偶数) 个点的树,边带权。要求找出 n2\frac{n}{2}2n 对点,使得每个点对的距离之和最小。 题解 首先一条边不会被覆盖两次,如果覆盖了两次,一定有更优的组合方案; 对于一个点 uuu ,一定是优先子树内部消耗,否则 uuu 和 uuu 的父亲节点的边会被多次计算; 如果点 uuu 的子树大小是偶数,那么一定会内部消耗,否则 uuu 需要连向 uuu 的父亲节点。 代码 #pragma region原创 2021-01-27 15:28:01 · 106 阅读 · 0 评论 -
牛客 Rinne Loves Edges 树形dp
牛客 城市网络 题意 有一棵 nnn 个点的树,首先选取一个点 sss ,选择性的删除一些边,删边的代价是边的边权,要求删边之后没有原图中度为 111 的点可以到达 sss 。求最小的删边代价。 题解 树形dp,以 sss 为根建树; 对于每一个点 uuu ,要么孩子 vvv 也不可到达,要么删除连向 vvv 的边,即 dp[u]=min(dp[v],w)dp[u]=min(dp[v],w)dp[u]=min(dp[v],w)。 代码 #pragma region //#pragma optimize(原创 2021-01-18 00:16:26 · 136 阅读 · 1 评论 -
牛客 城市网络 树上倍增
牛客 城市网络 题意 给一棵 nnn 个点的树,每个节点代表一个城市,每个城市卖价值为 aia_iai 的珠宝,有 qqq 次询问,每次询问从 uuu 城市到 vvv 城市,一开始有价值为 ccc 的珠宝,如果当前经过的城市珠宝价值大于已有的所有珠宝的最大价值,就购买。保证 vvv 在 uuu 到根的路径上。问这次行程有几次购买。 题解 一次次的跳转到自己的父亲显然时间复杂度过大,所以考虑倍增跳转; 对于每次询问,在 uuu 的下方连一个虚拟的城市,城市卖价值为 ccc 的珠宝; 用 f[u]原创 2021-01-17 15:13:16 · 80 阅读 · 0 评论 -
Codeforces Round #695 (Div. 2) F. Strange Housing (树上差分)
F. Strange Housing 题意 给一棵 nnn 个节点的树,每个节点都有一个权值。统计有多少个满足以下要求的节点:从这个点出发的任意路径中,没有两个相同的权值出现在同一路径。 题解 很难直接求出满足要求的节点,但是我们可以标记不符合要求的点。 如果遍历到点 uuu ,并且在 a[u]a[u]a[u] 没有全部出现在以 uuu 为根的子树中,那么 uuu 的子树都不满足,因为一定有一条路径经过 uuu 和另一个权值等于 a[u]a[u]a[u] 的点。 如果遍历到点 uuu ,并且在以 uuu原创 2021-01-16 15:51:09 · 83 阅读 · 0 评论 -
2020-2021 ACM-ICPC Brazil Subregional Programming Contest E. Party Company
2020-2021 ACM-ICPC Brazil Subregional Programming Contest E. Party Company 题意 一个公司有 nnn 个成员,他们的上下级关系组成了一棵树,根节点是 111 ,每个点都有一个点权 aia_iai 表示成员的年龄。将会有 mmm 次派对,派对的发起人是 OOO ,参加派对要求年龄在 [L,R][L,R][L,R] 的范围内,保证发起人的年龄在区间内。并且要求参加派对前提是上下级中至少有一人也参加了派对。保证父亲结点的权值大于等于孩子结原创 2020-11-23 16:35:22 · 1214 阅读 · 0 评论