[集训队作业2018] 三角形(贪心,堆,线段树合并)

这篇博客介绍了如何利用贪心策略和堆解决一个关于树上石子操作的问题,其中涉及操作顺序的优化。通过转换问题,使用二元组和优先级来确定操作顺序,确保在满足约束条件下,历史上的石子最大数量最小。最终通过堆和线段树合并实现了O(nlogn)的时间复杂度解决方案。
摘要由CSDN通过智能技术生成

传送门

首先,在结点 u u u放上 w [ u ] w[u] w[u]个石子后,出于贪心考虑,下一步一定会把 u u u的所有儿子 v v v上的石子收回手中。

转换题意:
c n t cnt cnt为当下树上的石子数,对每个结点 u u u可以执行一次操作:

  • step1. c n t + = w [ u ] cnt+=w[u] cnt+=w[u]
  • step2. c n t − = ∑ v ∈ s o n ( u ) w [ v ] cnt-=\sum_{v\in son(u)}w[v] cnt=vson(u)w[v]

当且仅当对 u u u的所有儿子 v v v都执行过操作,才能对 u u u执行操作。
问历史上 c n t cnt cnt的最大值最小可以是多少?

先不考虑 儿子都操作完父亲才能操作的限制,思考一个简单版问题:有 n n n个操作 ( a [ i ] , b [ i ] ) (a[i],b[i]) (a[i],b[i]),其含义为:先令 c n t + = a [ i ] cnt+=a[i] cnt+=a[i],再令 c n t + = b [ i ] cnt+=b[i] cnt+=b[i]。对这 n n n个操作排序,使历史上 c n t cnt cnt的最大值最小。( a [ i ] = w [ i ] , b [ i ] = − ∑ w [ v ] a[i]=w[i],b[i]=-\sum w[v] a[i]=w[i],b[i]=w[v]

对于一段操作 i , i + 1 , . . . , j i,i+1,...,j i,i+1,...,j,设经过这段操作后 c n t = c n t + d e l t a cnt=cnt+delta cnt=cnt+delta,且执行这段操作途中历史上 c n t cnt cnt的最大值为

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值