BZOJ3631 松鼠的新家(差分)

这是一道利用差分和树形DP解决的问题,要求在树上的路径上放置糖果。通过为节点x和y各加1,它们的最近公共祖先lca(x,y)和其父节点各减1,然后自底向上累加求解。注意,路径上的每个节点除了首尾外,都多计算了一次,因此需要减去1。倍增LCA在此题中起到关键作用。" 113216424,10540666,Lua连接MySQL数据库:luasql源码编译与使用教程,"['数据库开发', 'lua编程', '数据库连接库', 'luasql']
摘要由CSDN通过智能技术生成

题目链接:BZOJ 3631
题解:从节点x走到节点y经过的所有节点都要放一块糖果,树上两个点之间的路径是唯一的,经过lca(x,y),所以可以差分来做。x 和 y 处 +1,lca(x,y) 和 fa[lca(x,y)] 处 -1,从下到上累加答案即可。又因为一条路径的终点是下一条路径的起点,除了a1和an,其他节点处的糖果数都多算了一次,减掉1;an处不用放糖果,也减掉1;

PS:倍增lca好久没写,写出来一直WA……后来又看了hzwer大神的代码,好棒诶,特地粘过来保存一下
我的(我的)
改成hzwer大神的之后(改成hzwer大神的之后)

code

//我的代码(hzwer大神的写在注释里啦)
#include<iostream>
#include<cstdio>
#include<cstring>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值