牛客练习赛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 ...
随机推荐
- [转帖]为什么HikariCP被号称为性能最好的Java数据库连接池,如何配置使用
为什么HikariCP被号称为性能最好的Java数据库连接池,如何配置使用 原创Clement-Xu 发布于2015-07-17 15:53:14 阅读数 57066 收藏 展开 HiKariCP是 ...
- Django 路由name使用
Django 路由name使用 name:对URL路由关系进行命名 ***以后可以根据此名称生成自己想要的URL*** # 路由 url 三种形式 url(r'^index/', views.inde ...
- 【vue】搭建vue环境以及要安装的所有东西
参考地址: https://www.cnblogs.com/laizhouzhou/p/8027908.html
- python函数对变量的作用及遵循的原则
1.全局变量和局部变量 全局变量:指在函数之外定义的变量,一般没有缩进,在程序执行的全过程有效 局部变量:指在函数内部使用的变量,仅在函数内部有效,当函数退出时变量将不存在 例如: n=1 #n是全局 ...
- linux或者shell进入vi命令
vi的基本操作 a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi file 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(comman ...
- SUSE12Sp3-安装DockerCE和Docker-compose
最近在写脚本.发现还是很方便的. Docker下载地址:https://download.docker.com/linux/static/stable/x86_64/ 执行以下脚本即可安装完毕. #! ...
- c#高效准确的条形码、线性条码、QR二维码读写类库-SharpBarcode介绍
SharpBarcode是一款支持.NET(C#,VB)的高效易用的条形码.QR二维码的读取和生成类库. 主要功能: 1.支持几乎所有常见类型的线性条形码和QR二维码的读取,高效读取,准确率高. 2. ...
- 2019 翔通动漫java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.翔通动漫等公司offer,岗位是Java后端开发,因为发展原因最终选择去了翔通动漫,入职一年时间了,也成为了面 ...
- python3.6安装pyinstaller报错:AttributeError: module 'enum' has no attribute 'IntFlag'
转载至:https://blog.csdn.net/qq_41185868/article/details/80599336 感谢原作者的分享 解决思路:这可能是由包Enum34引起的.因为Pytho ...
- 换个语言学一下 Golang (10)——并行计算
如果说Go有什么让人一见钟情的特性,那大概就是并行计算了吧. 做个题目 如果我们列出10以下所有能够被3或者5整除的自然数,那么我们得到的是3,5,6和9.这四个数的和是23.那么请计算1000以下( ...