题解 CF1059E Split the Tree
1.题解 CF1059E Split the Tree
2.题解 CF932D Tree3.题解CF1775C4.题解 CF1729D5.题解CF1729C6.题解 CF1264D1 Beautiful Bracket Sequence (easy version)题意
将一棵
- 点数不超过
。 - 点权和不超过
。 - 对于链上的某一位置
( ),满足 是 的父亲。
求最少分成几个链。特别的,倘若无解,输出 -1。
解决
显然的,我们是从儿子转移到父亲,问题就在于我们父亲节点的选择方式,是再起炉灶,还是承接某一个儿子,又承接哪一个儿子。
想想看,倘若我们将这个树当做一条链,我们应当如何解决。
明显的,我们应该是在能延伸的情况下就尽量延伸,这样我们可以让我们这个新生的节点的末尾更远。
也就是说,当我们在树上时,我们只要有一个儿子能有余地转移,我们就应当承接转移。
接下来的问题在于承接哪一个儿子。
贪心的,我们选择可以延伸更远的那一个儿子的链。
对于处理延伸的长度,我们可以用树上倍增处理,维护
总结一下,我们在解决这道题时,我们用倍增维护我们的延伸最远,再在儿子中寻找最远,倘若没有,就从自己再起炉灶。
特殊的,为了判断 -1,我们需要在一开始就判断是否存在一个节点的权值大于
核心代码。
inline void redfs(int now,int fath) { int u=now,tot=val[now],cnt=0; for(int i=19; ~i; --i) { if(cnt+(1<<i)+1>L) continue; if(tot+sum[u][i]>S) continue; cnt+=(1<<i); tot+=sum[u][i]; } mx[now]=cnt; for(auto to:lj[now]) { if(to==fath) continue; redfs(to,now); sy[now]=max(sy[now],sy[to]-1); } if(sy[now]==-1) { ++ans; sy[now]=mx[now]; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!