ことばがありあまれどなお、 このゆめはつづ|

trsins

园龄:3年10个月粉丝:18关注:2

【做题记录】CF1039D You Are Given a Tree

  • CF1039D You Are Given a Tree 

    • 算法:根号分治,dp

题目:

有一棵 n 个节点的树。

其中一个简单路径的集合被称为 k 合法当且仅当:

树的每个节点至多属于其中一条路径,且每条路径恰好包含 k 个点。

对于 k[1,n],求出 kk 合法路径集合的最多路径数 即:设 k 合法路径集合为 S,求最大的 |S|

n105

题解:

首先考虑一个贪心。

在一棵子树中尽可能地最大化完整路径条数。其次最大化未完成的链的长度。

然后进行合并时,先尝试与子树拼接,不行则往上延伸。

不过一次 O(n)

fk 表示对于给定 k 的答案。

显然有 fknk

考虑 k 的取值。

k[1,n],共 n 种;

k>n,亦为 n

所以 fk 的取值个数为 O(n) 级别的。

然后 f 显然单调。

所以在边界上二分即可。

伪代码:

 
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;
	}
	...
}

时间复杂度 O(nnlogn)

本文作者:trsins

本文链接:https://www.cnblogs.com/trsins/p/15776614.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   trsins  阅读(46)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示