为美好的XCPC献上典题 ABC359 G - Sum of Tree Distance(根号分治)

每周至少五篇博客:(4/5)第五篇打算由更新一下题解传送门补充

https://atcoder.jp/contests/abc359/tasks/abc359_g

题意

为您提供 N N N 顶点的树。 i i i \ - th边缘连接 u i u_i ui 和{444493618}双向。

此外,给您一个整数序列 A = ( A 1 , … , A N ) A=(A_1,\ldots,A_N) A=(A1,,AN)

在这里,定义 f ( i , j ) f(i,j) f(i,j) 如下:

  • 如果 A i = A j A_i = A_j Ai=Aj ,则 f ( i , j ) f(i,j) f(i,j) 是您需要穿越的最小边数才能从顶点 i i i 移动到顶点 j j j 。如果 A i ≠ A j A_i \ne A_j Ai=Aj ,则 f ( i , j ) = 0 f(i,j) = 0 f(i,j)=0

计算以下表达式的值:

∑ i = 1 N − 1 ∑ j = i + 1 N f ( i , j ) \displaystyle \sum_{i=1}^{N-1}\sum_{j=i+1}^N f(i,j) i=1N1j=i+1Nf(i,j)

思路

实际上这道题已经有很多解法了,分析贡献,根号分治,树链剖分,点分治,这里选取根号分治的做法

对于元素可以根据一些条件分类的问题其实都可以考虑下能不能根号分治

对于本题,我们根据每种权值的数量来进行根号分治

对于同一权值的节点的数量如果满足 ≤ M \le M M 的话(其中 M M M 是一个常数),那么这个数量并不会很多,我们可以直接枚举相同权值的两个节点并计算他们的贡献。

例如枚举的节点是 u , v ( a u = a v ) u, v(a_u = a_v) u,v(au=av) ,设他们的最近公共祖先是 l c a lca lca ,那么这两个节点的贡献是 d e p u + d e p v − 2 × d e p l c a dep_u + dep_v - 2\times dep_{lca} depu+depv2×deplca ,直接枚举两个节点的时间复杂度是 O ( M 2 ) O(M^2) O(M2) ,最多进行 n M \frac n M Mn 次,当

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值