知不可乎骤得,托遗响于悲风。
lzyqwq
·
·
题解
感谢这题给我送退役了。
题意很简洁了,这里不再概括。
考虑到 \text{dfn} 最小值和最大值两个点求一下 \text{LCA} 的做法和我一样没有前途,因此换一条路冲,注意到一个结论:
记 a_i=\text{dep}_{\text{LCA}(i,i+1)},则当 l\ne r 时 \text{dep}_{\text{LCA}^*(l,r)}=\min\limits_{i=l}^{r-1}a_i。
证明:
- 随着区间的扩展 \text{LCA} 深度一定不升,因此 \text{LHS} \le \text{RHS}。
- 考虑区间 \text{LCA}=x,则一定存在区间内两个点 i,j(i<j) 来自于 x 的不同子树。此时 [i,j) 中一定存在一个位置 p 满足 p 和 p+1 来自不同子树,则 a_p 会取到 \text{dep}_x。
因此把 k=1 的询问判掉之后,令 r\leftarrow r-1,k
\leftarrow k-1。则问题变成求一个子区间 [l',r']\sube [l,r] 满足 r'-l'+1\ge k 且区间最小值最大。
考虑枚举答案 $v$,找到所有 $a_i\ge v$ 的极长连续段,则只要询问区间 $[l,r]$ 和极长连续段交集对应的区间长度 $\ge k$,那么答案就可以 $\ge v$。因此答案是最大的 $v$ 使得存在一个 $a_i\ge v$ 的极长连续段 $[l',r'] $ 和 $[l,r]$ 的交集区间长度 $\ge k$。
极长连续段可以这样找:从大到小加入 $a_i$,每次尝试和左右相邻的极长连续段合并。这样一定会找到极长连续段,还会找到一些非极长的。但是没关系,跟非极长交出来区间长度 $\ge k$ 则和极长的交出来的区间长度也一定 $\ge k$。这个过程可以 `set` 维护。
此时如果你考虑两个区间的关系为包含、被包含、左边相交、右边相交四类,会搞出三维偏序来,无法接受。但是可以不这么拆。
考虑将答案分成以下有重叠且并集为全集的部分,重叠显然不影响最大值:
- $l\le l'$。
- $r\ge r'$。
- $l'\le l\le r\le r'$。
第三种交集是整个区间肯定合法,因此是求这个范围内的极长连续段的 $v$ 最大值,扫描线 + BIT 维护即可。
至于前两种是类似的,以第一种为例。
此时要求 $l'\in[l,r-k+1]$ 才能交出长度 $\ge k$ 的子区间。我们发现剩下仅需要满足 $r'-l'+1\ge k$ 就够了。这个是充要的,可以讨论 $r',r$ 的大小关系证。
那么看成关于 $l'$ 和 $r'-l'+1$ 两维的二维偏序即可。由于是 $3-\text{side}$ 因此用线段树 + 扫描线维护。
时间复杂度为 $\mathcal{O}(n\log n)$,空间复杂度为 $\mathcal{O}(n)$。
[AC Link](https://www.luogu.com.cn/record/192259871) & [Code](https://www.luogu.com.cn/paste/m07y8lze)
> 知不可乎骤得,托遗响于悲风。你不能只在进省队的时候才热爱 OI。你不能只在切出 DS 的时候才热爱 DS。