CF1039D You Are Given a Tree

更好的阅读体验

题意

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

n105

题解

考虑 k 固定时怎么做

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

简单证明一下:
对于点 u 满足在其子树内有一条经过该点且不经过以被使用点的链,如果这条链不计入答案,而是选取一条经过 u 的但不完全在 u 子树中的链,这样划分的链数不会增加,反而会占用这条链在点 u 子树外的点
因此,按照上述方法贪心是最优的

fi 表示 k=i 时的答案,显然有 fini

类似除法分块,fi 一共只有 O(n) 种取值
证明如下:

  • in
    显然只有不超过 n 种取值
  • i>n
    fi<nsqrtn=n
    显然也只有不超过 n 种取值

因此我们对于每一种取值二分右端点,时间复杂度为 O(nnlogn),不足以通过此题

观察到前几种取值比较密集,对每种取值二分是很浪费的,考虑对前 T 项直接暴力,只对后面的 O(nT) 种取值二分

时间复杂度为 O(nT+nTlogn)Tnlogn 时有最优复杂度 O(nnlogn)

细节

实现的时候注意常数,特别是不要每次贪心都dfs一遍,可以直接在dfs序上贪心

代码 codeforces submission 144337474

posted @   gzezFISHER  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示