吉首大学2019年程序设计竞赛- 滑稽树下你和我
题意:给出一棵树,树上每条边给出一个权值,现在要求
(distance(i,j)表示i到j节点的距离)。
题解:这种题肯定不能是暴力,现在我们就可以看每条边最终要被计算多少次,这样我们只需要我们只需要更新边的贡献值就行了,看下图。

现在我们来计算(u,v)之间的边的贡献值,现加入v为u的子节点(建双向边,任一点都可以为根节点,现在就假如我们这样简图),我们首先跑一遍DFS,将每个节点下面有多少个子节点计算出来,用sum数组保存,现在sum[u]=5,sum[v]=4,这个边的贡献值就是有多少条路径要经过他,很显然是sum[v]乘以(n-sum[v]),(n表示有n个节点)。
#include
#include
#include
#include
#include
2019长安大学ACM校赛-LaTale
题意:给出一棵树,给出树上每条边的权值,现在让你找出一对节点要求两节点的距离能够被三整除,问这棵树上能找出多少个这样的节点。
题解:枚举每个点,计算出以这个点为要找的两个点左边那个点时(左边为相对),满足条件的另一个点有多少个。
#pragma comment(linker, "/STACK:102400000,102400000")
#include
#include
#include
#include
#include