[APIO2018] Duathlon 铁人两项
作者:互联网
传送门:铁人两项
简述一下题目:
给出一个(不一定联通)的图,求有多少个三元组(s,c,f)满足s,c,f都是图中的点,且存在一条从s到c的路径和一条从c到f的路径,使得两条路径没有公共点(除c以外)。
这个题当时刚接触到圆方树,我的想法跟正解十分接近使我非常兴奋。
这个题我们想一下如果n2的话我们要怎么做:
枚举两个圆点s,f。路径上所有的点双中的点都可以作为c。如何方便地统计呢?首先我们建出圆方树,把圆点权值设为-1(因为正常计算有重复路径,这样直接免去容斥减的过程),方点权值设为点双的大小,则s到f的路径上的点(包括s,f)的权值和,也就是c的个数。这是n方的。
如果枚举中间点,则很容易求出树上有多少个圆圆路径经过这个点,通过这个点的子树大小直接O(1)进行计算即可,这样我们只用把所有的点枚举一遍即可,这样是O(n)的。
代码先咕咕咕
标签:APIO2018,Duathlon,路径,圆点,枚举,圆方树,权值,铁人 来源: https://www.cnblogs.com/excellent-zzy/p/11261309.html