CF1486F Pairs of Paths

6s的时限,这么夸张。

给了树上m条路径。

询问有多少对路径只有一个交点,输出数量。

 

首先,我们可以对树上每个点,开个vector存放经过它的路径?

这种树上路径覆盖的问题,天天爱跑步,爷青回。

 

树上的路径,注意是树上,两条路径,如果有交点,那么——

先把路径分类

 

第一类:直上直下的

第二类:拐弯的

 

两条路径的唯一交点,一定是其中一个路径的最高点(两端点的lca)

因此,对于m条路径,可以确定m个标记点,只有这些标记点才有可能称为唯一交点。

我们枚举m条路径,对于它的标记点,找还有哪些路径与它的唯一交点是它。

如果枚举出的路径p,是第一类,那么另一条路径q,如果是第一类,那么其最低点一定不在p的标记点的下一点的子树内。

如果我们做一次dfs,计算每点的dfs序,每个点的子树的dfs序的区间,那么我们就可以O(1)判断一个点是否在一个点的子树内。

 

如果q是第二类,那么两个端点一定不在标记点的下一点的子树内。

这样看来1v1 1v2都很容易判断,但是这样是O(NM)的

最好只枚举标记点,然后计算所有路径配对

 

「但是这样是O(NM)的」

 我们想另外一个问题,一个数轴上有许多标记点,我们给出一堆区间,我们想计算每个区间内部所含点的数量。

如果我们每个点枚举,然后每个区间枚举判断是否在其内部,就是O(NM)的

但是其实是没必要这么做。

我们可以求出前缀和,然后做到O(N+M)

那么这个问题可能也有类似的优化方法。

posted @ 2021-03-12 16:11  AngelKnows  阅读(52)  评论(0)    收藏  举报