CF1695D2 Tree Queries (Hard Version)
先说以下自己的思路,
我们看这个
于是我想如果一种选点的方案不可行,当且仅当存在两个节点
感性理解一下,如果
如样例,当
于是我们发现对于一个点
因此原问题就变成了考虑树上所有点连向的点中最多只有一个点的子树内没有关键点,最少可以放多少关键点
然后这个问题就做不下去了233
首先,绝对显然的是这些关键节点在叶子上,否则一定不优
我们发现,如果选择两个节点
因为我们考虑如果
否则,我们可以找到一个最大的
例如样例,我们如选择了
我们发现链不好考虑,而且是没有必要的,因此我们先把所有的链缩成一条边,最后得到的图中每个点要么度数
容易想到这么建了一棵新树后对于每个点的所有儿子,必然最多只有一个儿子内没有关键点;于是我们贪心的选择,让每一个儿子就只有
于是我们有以下计算方案:对于每一个点,记新图中与它直接相连的叶子个数为
这个做法正确的原因是对于每个节点,与它相连的非叶子节点一定已经在枚举它时都被考虑过,因此我们只用考虑对于
如果我们用
for(int i=1;i<=n;i++){
d[i]-=(int)E[i].size();
//如果在新树上度为 1,那就是其中一条上出边,与一条连到附属点的边虚化
//否则减新树上所有出边
if(!vis[i])ans+=max(d[i]-1,0);//还有剩下的附属点
}
的,阅读的时候要注意一下。
我们考虑一下怎么优化
我们发现其实我们并不需要直接把新树建出来,因为我们发现对于原树的每个叶子,把他沿着一条链暴力上传,直到上传到
个人实现的时候是在树上找了一个
最终复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?