【牛客练习赛55-E】:树【树形dp】

该博客详细解析了牛客练习赛55-E题,即如何利用树形dp解决求一棵边权全为1的树中,任意两点之间距离平方和的问题。博主通过分析指出,对于距离平方的和,可以沿用树形dp思路,考虑每条边的贡献,由于边权为1,每条边的贡献等同于经过该边的所有路径长度和,通过维护子树节点数量和到根节点的距离和可以快速计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

牛客练习赛55 - E:树

题意:

给定一颗边权全为 1 的树,求两两点之间距离的平方的和

分析:

如果是求两两之间距离的和,直接树形dp算每条边的贡献即可;现在题目要求距离平方的和,还是考虑树形dp枚举每条边计算每条边的贡献,套路地将平方展开看一下,比如算: (a+b+c)*(a+b+c) = a^2 + a*(b+c) + b^2 + b*(a+c) + c^2 + c*(a+b),发现对于每一条边它的贡献都是一样的计算方式,边权又为 1,那么每条边的贡献就是经过这条边的所有路径的长度和,这个只需要维护子树节点的个数和子树节点到根的距离和就能 O(1) 快速计算,树形dp枚举每条边就做完了

 代码:

#include <bits/stdc++.h>
 
#define x first
#define y second
#define pii pair<int,int>
#define sz(x) (int)(x).size()
#define Max(x,y) (x)>(y)?(x):(y)
#define Min(x,y) (x)<(y)?(x):(y)
#define all(x) (x).begin(),(x).end()
using namespace std;
typedef long long LL;
const int maxn = 1e6+16;
const int mod = 998244353;
inline int read(){
    int x = 0, f = 1; char c = getchar();
    while(!isdigit(c)){if(c == '-')f=-1; c=getchar();}
    while(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值