$two\ pointer$ + 倍增.
首先破环成链,接一段长度为 $m$ 的在后面.因为区间不覆盖,对于一个区间 $(l,r)$ ,它后面应该接的区间可以贪心确定,就是左端点在 $[l,r]$ 范围内,而右端点最大的区间.这个可以通过 $two\ pointer$ 预处理.
然后用倍增的做法,处理 $f(i,j)$ 表示区间 $i$ 之后的第 $2^j$ 个区间标号.
查询时从 $i$ 开始跳,找到第一个区间使得区间总长 $\ge m$ 即可.时间复杂度 $O(n\cdot \log m)$ .
1 |
|