首页 > 其他分享 >ABC359 G - Sum of Tree Distance

ABC359 G - Sum of Tree Distance

时间:2024-06-23 09:02:17浏览次数:3  
标签:Distance 题解 Sum Tree ABC359 节点

题目链接

题目大意

给出一棵树,树上每个节点都有一种颜色,求所有颜色相同的节点两两之间距离的总和。

 

题解

想来写题解主要是看了一下官方解法都写的需要“重心分解”,应该是对应中文语境下的树的点分治。实际上点分治写起来很费事,可以用启发式合并替代。

具体来说,dfs时每个节点都维护一个数据结构(平衡树线段树都可以)用来统计子树下各个颜色节点的数量,维护时启发式合并即可,缺点是复杂度应该是两个logn的。

为了统计答案,除了维护节点数量还需要一边统计他们的深度之和。

代码链接(用小号打的hhh)

标签:Distance,题解,Sum,Tree,ABC359,节点
From: https://www.cnblogs.com/Enceladus/p/18263024

相关文章

  • UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359) 题
    点我看题A-CountTakahashi没啥好说的点击查看代码#include<bits/stdc++.h>#definerep(i,n)for(inti=0;i<n;++i)#definerepn(i,n)for(inti=1;i<=n;++i)#defineLLlonglong#definefifirst#definesesecond#definepbpush_back#definemprmake_pair......
  • abc359_G Sum of Tree Distance 题解
    题目链接:Atcoder或者洛谷先考虑暴力,显然是枚举整棵树的路径,这个枚举复杂度显示是\(O(n^2)\),还不考虑计算\(f(i,j)\),考虑使用点分治优化枚举复杂度:\(O(n\log{n})\)。接下来考虑如何计算每条路径的\(f(i,j)\),注意到\(f(i,j)\):当且仅当\(a[i]=a[j]\)时,答案加上\(dis(i,j......
  • [题解]AT_abc240_f [ABC240F] Sum Sum Max
    思路题目要求的是\(\max_{a=1}^{n}\{\sum_{i=1}^{a}\sum_{j=1}^{a}{A_j}\}\),所以我们将\(\sum_{i=1}^{a}\sum_{j=1}^{a}{A_j}\)化简一下,得:\[i\timesA_1+(i-1)\timesA_2+\dots+1\timesA_x\]在\(a\)每增加\(1\)时,这个和\(s\)将会变......
  • [题解]AT_abc216_f [ABC216F] Max Sum Counting
    思路首先,不难发现,对于本题将\(a,b\)合成一个序列,并按照\(a_i\)排序的答案不会发生变化。所以,我们可以直接排序,那么,我们当前枚举到的\(a_i\)就是当前的\(\max(a_i)\)。定义\(dp_{i,j,0/1}\)表示在\(1\simi\)中,选择的\(b_i\)之和为\(j\),并且第\(i\)个数不选/选......
  • [题解]AT_abc151_e [ABC151E] Max-Min Sums
    思路考虑将\(\max\)和\(\min\)的贡献分开计算。显然我们对这个序列进行一次排序不会影响最终的答案,因此我们可以先排序一下。然后有一个很经典的trick,就是你枚举每一个数\(x\),将\(x\)令为最大值(最小值)。因为我们先前排序过一次,因此我们可以轻易的计算出比\(x\)小(大)的......
  • B. Modulo Sum
    https://codeforces.com/contest/577/problem/B题意:给定长度为n个数组和一个m(1<=n<=1e6,2<=m<=1e3),其中n中的元素(1<=x<=1e9)。问n中是否有子序列的和可以被m整除,输出YES或NO。思路:维护一个集合,依此遍历数组元素,每次遍历将集合中的元素进行更新,更新过程中看是否有0......
  • 探索Semantic Kernel内置插件:深入了解ConversationSummaryPlugin的应用
    前言经过前几章的学习我们已经熟悉了SemanticKernel插件的概念,以及基于Prompts构造的SemanticPlugins和基于本地方法构建的NativePlugins。本章我们来讲解一下在SemanticKernel中内置的一些插件,让我们避免重复造轮子。内置插件SemanticKernel有非常多的预定义插件,作为......
  • 实现CHECKSUM的C语言程序
    什么是校验和?在计算中,校验和是使用算法从较大的数据集创建的小数据,目的是对较大的数据集所做的任何更改都会导致不同的校验和。校验和通常用于验证已传输或存储的数据的完整性,因为数据中的错误或修改可能会导致校验和更改。它们还可用于验证数据的真实性,因为校验和通常是使用......
  • D. Prefix Permutation Sums
    原题链接题解1.缺少一个前缀和,缺少在哪了?如果缺少在\(i<n\)的地方,则会出现一个两个数之和,即缺少两个数否则会只缺少一个数2.两个数之和可能大于\(n\),也可能不3.虽然\(a_i\)达到了\(1e18\)但是\(n\leq2e5\),所以可以用数组记录出现的数code#include<bits/stdc++.......
  • 209. Minimum Size Subarray Sum
    Givenanarrayofpositiveintegersnumsandapositiveintegertarget,returntheminimallengthofasubarraywhosesumisgreaterthanorequaltotarget.Ifthereisnosuchsubarray,return0instead.Example1:Input:target=7,nums=[2,3,1,2,......