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)
那么这个问题可能也有类似的优化方法。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号