20250917NOIP#21
T2
题意:
给定一个 \(n\) 个点的树,点上有一个非负整数点权 \(a_i\),表示这个点需要在操作序列中正好被经过 \(a_i\) 次,一次操作为选择两个顶点 \(u,v\) ,从 \(u\) 经过简单路径走到 \(v\) ,求最小操作数。
思路:
见到这个题第一眼想到贪心,可以具象化的把一次操作拆成两条线段,线头在 \(u,v\) 分别传向父亲,最终在两个点的 \(lca\) 处汇聚,一个点一定需要被 \(a_i\) 条线段经过,此时的问题就转化成了求最小线段数。
考虑到叶子结点一定需要向父亲发出 \(a_i\) 条线段,在线段不断上传的过程中会合并两条线段。所以我们不妨在开启一条新线段的时候对于答案加一,合并两条线段(在 \(lca\) 处汇聚成 \(1\) 条线段)的时候对于答案减一。
现在就可以考虑与叶子结点直接相连的父亲了,此时他的儿子节点向其传了 \(sum=\sum a_i\) 条线段,显然具体情况需要分讨。
-
\(sum<a_i\),考虑此时合并两条线段时会使 \(a_i\) 减一、 \(sum\) 减二、\(ans\) 减一,但是我们又因为先前的新开线段数为 \(a_i-sum\) ,所以合并之后的新开线段数变成了 \((a_i-1)-(sum-2)=a_i-sum+1\) ,显然对于最终的答案数无影响,但导致此时上传的线段数变少,所以肯定不优。
综上所述,显然这种情况直接新开新线段即可。 -
\(sum>a_i\) ,此时我们必须要减少 \(sum-a_i\) 个线头,但是这些线头可以在当前节点合并,使得答案有所减少。但是我们考虑为什么需要合并?如果不合并剩下的线段对于答案的作用为何?
- 不同儿子向上传递的线头可以在父亲节点合并,使得答案减少 \(1\) 。
- 线头可以使得原本需要开的新线段数减少,即覆盖父亲节点,使得答案减少 \(1\)。
如果我们此时合并两条线段,答案必定减少 \(1\) ,但是会使得当前节点向上传的线段数减少 \(1\) ,影响即为 可能 会让父亲节点多开 \(1\) 条线段,使得答案增加 \(1\) 。
但是我们可以发现,此时对于答案 \(-1,+1\) 没有具体影响!即使我们不合并这两条线段,到了父亲节点也不会使得答案再次减少。
(有人会问在父亲节点再次让该线段与其他节点传上去的线段合并,答案不是会减少吗?但是这种情况违反了我们之前的前提:父亲节点需要新开线段。如果父亲节点不需要新开线段,那么答案在当前节点上合并两条线段时本来就会减少 \(1\) ,上述情况只是把贡献延迟到了父亲节点上对于贡献减 \(1\) 而已,所以无影响) 所以对于该情况,能合并的线段一定进行合并,显然最优。