CF1039D You Are Given a Tree

题意

给定一棵有 nn 个节点的树. 对于满足 1kn1\le k\le n 的每一个 kk,把树分成若干条包含 kk 个顶点的链,其中每个点最多属于一条链,问最多能分得几条链

n105n\le 10^5

题解

考虑 kk 固定时怎么做

贪心
对于一个点,如果在它的子树内有一条经过该点且不经过以被使用点的链,那么将这条链计入答案并将该点标记为使用过

简单的证明:
对于点 uu 满足在其子树内有一条经过该点且不经过以被使用点的链,如果这条链不计入答案,而是选取一条经过 uu 的但不全在 uu 子树中的链,这样划分的链数不会增加,还会占用点 uu 子树外的点

fif_i 表示 k=ik=i 时的答案,显然有 finif_i\le\lfloor\frac{n}{i}\rfloor

类似除法分块,fif_i 一共只有 O(n)\mathcal{O}(\sqrt{n}) 种取值

因此对于每一种取值二分右端点,时间复杂度为 O(nnlogn)\mathcal{O}(n\sqrt{n}\log n),不足以通过此题

考虑对前 TT 项直接暴力,只对后面的 O(nT)\mathcal{O}(\frac{n}{T}) 种取值二分

时间复杂度为 O(nT+nTlogn)\mathcal{O}(nT+\frac{n}{T}\log n)TTnlogn\sqrt{n\log n} 时有最优复杂度 O(nnlogn)\mathcal{O}(n\sqrt{n\log n})

代码 codeforces submission 144337474

CF1039D You Are Given a Tree

https://gzezfisher.top/cf1039d/

作者

Fisher Cai

发布于

2022-01-29

更新于

2025-07-22

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×