
树上问题
文章平均质量分 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 · 127 阅读 · 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 · 119 阅读 · 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 · 154 阅读 · 1 评论 -
牛客 城市网络 树上倍增
牛客 城市网络题意给一棵 nnn 个点的树,每个节点代表一个城市,每个城市卖价值为 aia_iai 的珠宝,有 qqq 次询问,每次询问从 uuu 城市到 vvv 城市,一开始有价值为 ccc 的珠宝,如果当前经过的城市珠宝价值大于已有的所有珠宝的最大价值,就购买。保证 vvv 在 uuu 到根的路径上。问这次行程有几次购买。题解一次次的跳转到自己的父亲显然时间复杂度过大,所以考虑倍增跳转;对于每次询问,在 uuu 的下方连一个虚拟的城市,城市卖价值为 ccc 的珠宝;用 f[u]原创 2021-01-17 15:13:16 · 90 阅读 · 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 · 100 阅读 · 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 · 1264 阅读 · 0 评论