牛客练习赛55 E 树
题意:给出n个点,n-1条边求任意两个点的距离平方的和
解法:
f[i]表示这个点的高度
sz[i]表示这个子树的大小
szz[i]表示这个这个子树大小的平方
sum[i]表示这个子树所有点高度的和
两个点i, j的距离dis = f[i] + f[j] - 2 * f[lca(i, j)]
dis的平方 = f[i] * f[i] + f[j] * f[j] + 2 * f[i] * f[j] * 4 * f[lca(i, j)] * f[lca(i, j)] - 4 * (f[i] + f[j]) * f[lca(i, j)]
前面三项直接计算即可
计算第四项就要计算点u为lca的(i, j)对数
以点u为lca的(i, j)对数为sz[u] * sz[u] - sz[v] * sz[v](v为u的所有儿子)
计算第五项就要计算以点u为lca的f[i]和f[j]的和
以点u为lca的f[i]和f[j]的和为2 * sum[v] * (sz[u] - sz[v]) (v为u的所有儿子)(乘2是因为(i, j),(j, i)都要计算)
最后再加上点u自身的贡献:2 * f[u] * sz[u]
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = ;
const int M = 1e6 + ;
ll ans;
int cnt;
int head[M];
ll sz[M], szz[M], f[M], sum[M];
struct Edge{
int next, to;
}edge[M * ];
void add_edge(int u, int v) {
edge[++cnt].next = head[u];
edge[cnt].to = v;
head[u] = cnt;
}
void dfs(int u, int fa) {
sz[u] = ;
f[u] = f[fa] + ;
sum[u] = f[u];
for(int i = head[u]; i; i = edge[i].next) {
int v = edge[i].to;
if(v == fa) continue;
dfs(v, u);
sz[u] += sz[v];
sum[u] += sum[v];
}
szz[u] = (sz[u] % mod) * (sz[u] % mod) % mod;
}
void dfs1(int u, int fa) {
ll ans1 = szz[u], ans2 = ( * f[u] % mod) * (sz[u] % mod) % mod;
for(int i = head[u]; i; i = edge[i].next) {
int v = edge[i].to;
if(v == fa) continue;
dfs1(v, u);
ans1 = (ans1 - szz[v] + mod) % mod;
ans2 = (ans2 % mod + ( * sum[v] % mod) * ((sz[u] - sz[v]) % mod) % mod) % mod;
}
ans = (ans % mod + (( * f[u] % mod) * (f[u] % mod) % mod) * (ans1 % mod) % mod) % mod;
ans = (ans % mod - ( * ans2) % mod * (f[u] % mod) % mod + mod ) % mod;
}
int main(){
int n;
while(~scanf("%d", &n)) {
cnt = ;
ans = ;
memset(head, , sizeof(head));
for(int i = ; i <= n - ; i++) {
int u, v;
scanf("%d%d", &u, &v);
add_edge(u, v);
add_edge(v, u);
}
dfs(, );
ll summ = ;
for(int i = ; i <= n; i++) {
summ = (summ % mod + f[i] % mod) % mod;
ans = (ans % mod + ((f[i] % mod) * (f[i] % mod) % mod ) * (( * n) % mod )% mod) % mod;
}
ans = (ans % mod + ( * summ % mod) * (summ % mod) % mod) % mod;
dfs1(, );
printf("%lld\n", ans);
}
return ;
}
牛客练习赛55 E 树的更多相关文章
- 牛客练习赛1 B - 树
链接:https://www.nowcoder.com/acm/contest/2/B来源:牛客网 题目描述 shy有一颗树,树有n个结点.有k种不同颜色的染料给树染色.一个染色方案是合法的,当且仅当 ...
- 出题人的手环(牛客练习赛38D 离散化+树状数组)
题目链接(https://ac.nowcoder.com/acm/contest/358/D) 题目描述 出题人的妹子送了出题人一个手环,这个手环上有 n 个珠子,每个珠子上有一个数. 有一天,出题人 ...
- 牛客练习赛55 E-树 树形DP
题意 你有一颗大小为\(n\)的树,点从\(1\)到\(n\)标号. 设\(dis(x,y)\)表示\(x\)到\(y\)的距离. 求\(\sum_{i=1}^{n}\sum_{j=1}^{n}di ...
- 牛客练习赛28-B(线段树,区间更新)
牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, 1 l r 询问区间[l,r]内的元素和 2 l r 询问区间[l,r]内的 ...
- 牛客练习赛 29 E 位运算?位运算!(线段树)
题目链接 牛客练习赛29E 对$20$位分别建立线段树.首先$1$和$2$可以合起来搞(左移右移其实是等效的) 用个lazy标记下.转移的时候加个中间变量. $3$和$4$其实就是区间$01$覆盖操 ...
- 牛客练习赛11 假的字符串 (Trie树+拓扑找环)
牛客练习赛11 假的字符串 (Trie树+拓扑找环) 链接:https://ac.nowcoder.com/acm/problem/15049 来源:牛客网 给定n个字符串,互不相等,你可以任意指定字 ...
- 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D
目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...
- 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B
牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...
- 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A
牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...
随机推荐
- Mysql 数据库 表中列的操作
[1]Mysql数据库中表的列操作 Mysql中关于表中列的操作集语句: -- [1]增加一列 ) DEFAULT NULL COMMENT '目的码区号'; -- [2]增加一列,在dnis_are ...
- react 中 Modal 多次使用且带参数不同实现
一.举例:对于 echatrs 的柱子分别需要弹窗 带参数 触发弹窗出现事件 showModalhref myChart.on('click', (params) => { switch (pa ...
- ASP.NET Core中如何显示[PII is hidden]的隐藏信息
有时候我们在ASP.NET Core项目运行时,发生在后台程序中的错误会将关键信息隐藏为[PII is hidden]这种占位符,如下所示: 而知道这些关键信息,有时候对我们调试程序是非常重要的.所以 ...
- 整理下log4net日志
今天整理了下log4net日志,记录一下... 日志是一个系统排错的重要组成,有在之前的.NET中,微软还没有提供过像样的日志框架,目前能用的一些框架比如Log4Net.NLog.CommonLogg ...
- VMware Workstation报错 : 另一个正在运行的VMware进程可能正在使用配置文件
这个问题出现于虚拟机卡死后用任务管理器关闭了VMware,然而还有虚拟机的进程在运行而且还关不掉(三步操作便可解决这一问题) 一.打开系统配置使用程序进行设置 1.Win+R打开运行输入:msconf ...
- python数据分析三剑客之: Numpy
数据分析三剑客之: Numpy 一丶Numpy的使用 numpy 是Python语言的一个扩展程序库,支持大维度的数组和矩阵运算.也支持针对数组运算提供大量的数学函数库 创建ndarray # 1 ...
- Java程序优化细节
1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 1).控制资源的使用,通过线程同 ...
- npm换源成淘宝镜像
由于node下载第三方依赖包是从国外服务器下载,虽然没有被墙,但是下载的速度是非常的缓慢且有可能会出现异常. 所以为了提高效率,我们还是把npm的镜像源替换成淘宝的镜像源.有几种方式供我们选择 使用c ...
- consul:架构
官方文档:https://www.consul.io/docs/internals/architecture.html
- 自制微擎AI面相识别算术阈值
有时在朋友圈或其他地方会看到一些AI面相的分享链接或小程序,不是面相算命的有多吸引人,而是前面有"AI"两个字母.于是我就上网找了一下相关代码,发现了一个微擎系统的面相模块.下载下 ...