[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 铁人两项

上一篇:windows server安装dotnet-sdk-2.2.108-win-x64.exe时报dll找不到


下一篇:windows宿主机访问ubuntu虚拟机中的docker服务