【做题记录】CF1039D You Are Given a Tree
-
- 算法:根号分治,
题目:
有一棵 个节点的树。
其中一个简单路径的集合被称为 合法当且仅当:
树的每个节点至多属于其中一条路径,且每条路径恰好包含 个点。
对于 ,求出 kk 合法路径集合的最多路径数 即:设 合法路径集合为 ,求最大的 。
。
题解:
首先考虑一个贪心。
在一棵子树中尽可能地最大化完整路径条数。其次最大化未完成的链的长度。
然后进行合并时,先尝试与子树拼接,不行则往上延伸。
不过一次 。
设 表示对于给定 的答案。
显然有
考虑 的取值。
当 ,共 种;
当 ,亦为 ;
所以 的取值个数为 级别的。
然后 显然单调。
所以在边界上二分即可。
伪代码:
f[n]<=f[n-1]<=...<=f[1]
x=f[n];
check(x){
int l=1,r=n;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)<x){
l=mid+1;
res=mid;
}
else r=mid-1;
}
...
}
时间复杂度 。
本文作者:trsins
本文链接:https://www.cnblogs.com/trsins/p/15776614.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
标签:
做题记录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步