P5439 【XR-2】永恒
先做一些基本的转化。考虑处理点对 \((x,y)\) 的贡献,那么答案可以写成这样的形式:
其中 \(f(x,y)\) 表示同时经过 \(x,y\) 的路径条数。
做法一
考虑套上一个点分治,假设当前分治中心为 \(rt\),那么有 \(f(x,y)=sz_xsz_y\),其中 \(sz_x\) 表示 \(x\) 在以 \(rt\) 为根的情况下的子树大小。如果能维护出 \(sz_x\),那么显然可以对所有点建虚树来统计答案。维护 \(sz_x\) 也比较简单,每次分治的时候维护一个 \(val_u\),分治完之后加上与 \(u\) 相连的在当前联通块中的点的个数即可。
这个做法主要是基于点分治的转化。
做法二
这个做法基于对于 \(\text{dep}(\text{LCA}(x,y))\) 的差分转化,对 \(\text{LCA}(x,y)\) 处的贡献差分转为链加是比较经典的套路。
先对原树求出 \(sz_x\) 表示 \(x\) 的子树大小,那么分类讨论 \(f(x,y)\)。如果 \(x,y\) 没有祖先关系,那么 \(f(x,y)=sz_xsz_y\),否则假设 \(x\) 是 \(y\) 的祖先,那么 \(f(x,y)=(n-sz_z)sz_y\),其中 \(z\) 是 \(x\to y\) 路径上离 \(x\) 最近的非 \(x\) 结点。
对于第一类贡献,我们直接在第二棵树上对 \(x\to rt\) 的路径上执行链加 \(sz_x\),在 \(y\) 处查询 \(y\to rt\) 路径上的和。对于第二类贡献,我们在 DFS 的时候修改贡献,假设当前遍历的边是 \((x,y)\),那么执行 \(x\to rt\) 减 \(sz_x\),并执行 \(x\to rt\) 加 \(n-sz_y\)。然后就行了。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号