这里回家路上水了个 trick:
考虑欧拉环游序,将LCA化成区间问题,问题变为连续 k 个位置所连接的区间的最小值中的最大值。
考虑整体二分。维护一个线段树,单修然后维护最大连通块大小,时间复杂度 O(nlog2n)。
显然过不了。
我又想了个方法:
考虑相邻 (i,i+1) 的贡献 mini=min(Ei,Ei+1)max(Ei,Ei+1)depi。
也就是说,我们连续 k 个的 LCA,可以表示成相邻两个的在环游序位置上的区间 min,这些 min 再取 min。
预处理出来,问题转化为区间中连续若干个值的最小值中最大值。
然后考虑一个值什么时候可以是一个区间的最小值,考虑用单调栈求出极左极右比他小的数。最后我们知道当 k 小于多少时他能是最小值。
最后我们按 k,排序,每次加入扩展区间长度>k的数,最后取区间最大值就行了。
这思路看起来很对,可是在做单调栈的时候,我们不仅仅只有 第一个比他小的数这个限制,还有区间左右端点,我想了很久都不知道怎么判。