How T4
查看原帖
How T4
553501
可爱的小棉羊楼主2024/11/30 15:29

这里回家路上水了个 trick:

考虑欧拉环游序,将LCA化成区间问题,问题变为连续 kk 个位置所连接的区间的最小值中的最大值。

考虑整体二分。维护一个线段树,单修然后维护最大连通块大小,时间复杂度 O(nlog2n)O(n\log ^2n)

显然过不了。

我又想了个方法:

考虑相邻 (i,i+1)(i,i+1) 的贡献 mini=min(Ei,Ei+1)max(Ei,Ei+1)depi\min_{i=min(E_i,E_{i+1})}^{max(E_i,E_{i+1})}dep_i

也就是说,我们连续 kk 个的 LCA,可以表示成相邻两个的在环游序位置上的区间 min\min,这些 min\min 再取 min\min

预处理出来,问题转化为区间中连续若干个值的最小值中最大值。

然后考虑一个值什么时候可以是一个区间的最小值,考虑用单调栈求出极左极右比他小的数。最后我们知道当 kk 小于多少时他能是最小值。

最后我们按 kk,排序,每次加入扩展区间长度>k的数,最后取区间最大值就行了。

这思路看起来很对,可是在做单调栈的时候,我们不仅仅只有 第一个比他小的数这个限制,还有区间左右端点,我想了很久都不知道怎么判。

2024/11/30 15:29
加载中...