CF407E

CF407E

考虑对于一个连续段 \([l, r]\) 是 k-d 序列的充要条件:

  • \(a_l \mod d = a_{l + 1} \mod d = \cdots = a_r \mod d\)

  • \(a_l \sim a_r\) 互不相同。

  • \(\max(a_l , a_{l + 1}, \dots a_r) - \min(a_l, a_{l + 1}, \dots a_r) \ge (r - l + k)d\)

前两个都还好说(随便处理一下即可),主要是第三个条件。

这时回想一下处理这种问题的几个套路:分治/单调栈。

两种方法都能做,但分治有点太复杂了。可以自己想想,好像还是两只 \(\log\)


还是考虑单调栈的做法。考虑从小到大枚举 \(r\),求出最小的满足条件的 \(l\)

将第三个条件变一下形:

\[\max(a_l , a_{l + 1}, \dots a_r) - \min(a_l, a_{l + 1}, \dots a_r) + ld \ge (r + k)d \]

用线段树维护左式,通过单调栈修改 \(\max, \min\),然后线段树上二分即可。

时间复杂度:\(O(n \log n)\)

posted @ 2025-12-19 22:43  xiehanrui0817  阅读(0)  评论(0)    收藏  举报