分析:这道题问的是树上整体的答案,当然要从整体上去考虑.

一条边对答案的贡献是这条边一端连接的点的个数*另一端连接的点的个数*边权,可以用一次dfs来统计答案,之后每次更改操作在原答案的基础上增减就好了.

千万不要傻傻地去求LCA......事实证明只有10分.问的是任意两点最短距离之和,树上两个点的最短路径只有一条,所以才要去考虑每条边的贡献的.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = ; long long n, head[maxn], nextt[maxn * ], tot = , to[maxn * ], w[maxn * ], num[maxn], fa[maxn], d[maxn], m;
long long ans; void add(long long x, long long y, long long z)
{
to[tot] = y;
w[tot] = z;
nextt[tot] = head[x];
head[x] = tot++;
} void dfs(long long u, long long fa)
{
for (int i = head[u]; i; i = nextt[i])
{
int v = to[i];
if (v != fa)
{
dfs(v, u);
num[u] += num[v];
ans += w[i] * num[v] * (n - num[v]);
}
}
num[u]++;
} int main()
{
scanf("%lld", &n);
for (int i = ; i <= n; i++)
{
long long x, y;
scanf("%lld%lld", &x, &y);
fa[i] = x;
d[i] = y;
add(x, i, y);
}
dfs(, fa[]);
printf("%lld\n", ans);
scanf("%lld", &m);
for (int i = ; i <= m; i++)
{
long long a, b;
scanf("%lld%lld", &a, &b);
ans += num[a] * (n - num[a]) * (b - d[a]);
printf("%lld\n", ans);
d[a] = b;
} return ;
}

最新文章

  1. Android动画效果之Property Animation进阶(属性动画)
  2. iOS中的一些细节
  3. nginx服务器的网站权限问题
  4. VSS错误自动修复
  5. 附录二 C语言标准库
  6. timersmanager 解析
  7. Share_memory
  8. IO_REMOVE_LOCK使用方法小结(转载加改正)
  9. Oracle- UPDATE FROM讲解
  10. 切换samba用户
  11. HDU 3966 dfs序+LCA+树状数组
  12. angular指令之complie和link不得不说的故事
  13. iOS UICollectionView(转三)
  14. python写zip破解器
  15. Subversion配置
  16. Java中的匿名内部类及内部类的二三事
  17. c#生成连续单号
  18. @staticmethod和classmethod
  19. python - isinstance/issubclass 函数
  20. hdu4812 逆元+树分治

热门文章

  1. (快排)51NOD 1018 排序
  2. JAXB解析xml 的注解说明
  3. [C陷阱和缺陷] 第4章 连接
  4. 【BZOJ4059】Non-boring sequences(分析时间复杂度)
  5. Linux环境下卸载、安装及配置MySQL5.1
  6. 每天学点Linux命令之Linux-Shell中的数据重定向与管道命令
  7. C# 代码笔记_文件
  8. NPOI 导出excel数据超65535自动分表
  9. Sql2008调试问题
  10. Git学习笔记(2)-创建仓库