每周至少五篇博客:(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=1∑N−1j=i+1∑Nf(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+depv−2×deplca ,直接枚举两个节点的时间复杂度是 O ( M 2 ) O(M^2) O(M2) ,最多进行 n M \frac n M Mn 次,当

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



