警示后人
查看原帖
警示后人
374433
ppip嘟嘟嘟楼主2022/8/24 21:47

我在写此题的时候,使用了如下方式进行最后查询:

for (int i{1};i<=n;++i)
        for (int j{LG};j>=1;--j)
            if (i+(1<<j)-1<=n) {
                merge(f[j-1],i,f[j][i]);
                merge(f[j-1],i+(1<<j-1),f[j][i]+(1<<j-1));
            }

但是这样,如果某一个点所在的集合被大于它的点更新了,就不会下穿到0。

解决方法是merge时把祖先编号小的往祖先编号大的连边。

2022/8/24 21:47
加载中...