【五校联考2015 9.5】送你一棵线段树

本文探讨了一种计算树形结构中所有节点对之间距离之和的算法。该算法适用于由多棵树通过特定方式组合而成的新树结构,通过递归和预处理技术实现了高效的求解。

题目大意

你有n棵树。每一棵树的形态如下给出:

  • 0号树T0只有一个点,标号为0
    • 对于第i棵树Ti(i>0),它通过拷贝第AiBi棵树,并将对应原树上的Ci号和Di号节点链接一条Li的边得到。并且新树上原本属于Bi节点的节点标号都加上了sizeAi

    现在要求你计算每一棵树的这个值

    iTijTidis(i,j)

    其中dis(i,j)表示树上点i和点j之间的最短路的长度。

    n<60,Ai<i,Bi<i,Case<100


    分析

    不难发现最坏情况下,sizeTn是可以达到2n的。
    我们先想一下如果我们要计算一棵树的答案需要知道些什么,很自然可以想到从这棵树的构成出发。它等于Ai的答案加上Bi的答案再加上跨过AiBi的所有路径的长度,前两部分可以递归地算,主要是看后一部分。

    后一部分显然等于

    sizeAisumDi+sizeBisumCi+LisizeAisizeBi

    size数组很好统计,主要是看如何计算sum
    考虑到每棵树上直接需要查询sum值的点顶多只有n个,间接需要查询(即后面的树上的某个点属于前面某棵树上的点,我们依旧需要把它算出)的点顶多只有n2个。
    那么依照前面的思路,我们拆成两棵树来分别维护这些关键点的sum值,假设xTi的关键点且xTAixTBi是同理的)。

    sumTi,x=sumAi,x+[dis(Ci,x)+Li]sizeBi

    那么新的问题就出现了,我们还有维护关键点之间的dis值。其实思路是同理的,就略推导的式子了。

    最终的时间复杂度O(n3Case)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值