题目大意

给一棵树,求∑∑w_i*w_j*w_LCA(i,j)

w_i表示i点权值

题解

显然一点点求lca是肯定会tle的

那就想如何优化

i和j的lcaj和i的lca是一样的

DFS,在每个x处,统计以它为LCA的答案总和

假设x有k个子树,权值和分别是S1,S2,…,Sk

设P=S1+S2+...+Sk 这些值可以轻易地在DFS中求出

①i、j分别在两棵不同的子树:{S1(P-S1) + S2(P-S2) + … +Sk(P-Sk)}*W_x

②i、j之一是x:(2W_x*P)*W_x

③i、j都是x:(W_x^2)*W_x

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
inline ll read()
{
ll sum = ,p = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-')
p = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
(sum *= ) += ch - '';
ch = getchar();
}
return sum * p;
}
const int N = ;
const ll mod = ;
int n;
ll w[N],sum[N],ans;
int head[N],cnt;
struct edge
{
int to,nxt;
}e[N];
void add(int a,int b)
{
e[++cnt].nxt= head[a];
e[cnt].to = b;
head[a] = cnt;
}
void dfs(int u,int fa)
{
sum[u] = w[u];
for(int i = head[u];i;i = e[i].nxt)
{
int v = e[i].to;
if(v == fa)
continue;
dfs(v,u);
(sum[u] += sum[v])%= mod;
}
}
void lcaa(int u,int fa)
{
for(int i = head[u];i;i = e[i].nxt)
{
int v = e[i].to;
if(v == fa)
continue;
ans = (ans + w[u]%mod * w[u]%mod * sum[v]%mod)%mod;
ans = (ans + (sum[u] - w[u] - sum[v])%mod *w[u]%mod * sum[v]%mod)%mod;
sum[u] = (sum[u] - sum[v] + mod)%mod;
}
for(int i = head[u];i;i = e[i].nxt)
{
int v = e[i].to;
if(v == fa)
continue;
lcaa(v,u);
}
}
int main()
{
n = read();
w[] = read();
for(int i = ;i <= n;i++)
{
int fa = read();
w[i] = read();
add(fa,i);
add(i,fa);
}
dfs(,);
lcaa(,);
ans = (ans * (ll)) % mod;
for(int i = ;i <= n;i++)
ans = (ans + w[i]%mod * w[i]% mod * w[i]%mod)%mod;
printf("%lld",ans);
return ;
}

最新文章

  1. js库之dojo
  2. css中margin-left与left的区别
  3. 用CSS让未知高度内容垂直方向居中
  4. diff, cmp, patch
  5. web前端开发资源整理
  6. Wicket Hello World Example
  7. Ubuntu(16.04) 下如何修改(安装)arm-linux-gcc编译器
  8. C#开发COM+组件和ActiveX控件
  9. Floyd-Warshall算法详解(转)
  10. java面试题集2
  11. Gradle里面两个 依赖管理插件,可以不用关心 具体jar版本号
  12. ubuntu 16.04 LTS - 谷歌拼音输入法
  13. 「NOI2017」泳池
  14. 12.输入一个成绩计算其A,B,C,D,E等级
  15. css常见的概念
  16. 百度地图API的网页使用
  17. 【Spring-AOP-学习笔记-5】@AfterReturning增强处理简单示例
  18. vue知识day1
  19. BZOJ5300:[CQOI2018]九连环——题解
  20. vmware10安装Arch

热门文章

  1. 二、vim的保存文件和退出命令
  2. No module named ‘sklearn.model_selection解决办法
  3. [codeigniter4]Upgrading from 3.x to 4.x
  4. 数据库ETL同步 cdc开启,Git同步url添加用户名密码
  5. bootstrap图片上传控件 fileinput
  6. 调用系统计算器n次
  7. tp5 使用phpword 替换word模板并利用com组件转换pdf
  8. STL初探
  9. 数据库程序接口——JDBC——初篇——目录
  10. linux下grep分析apache日志的命令集合