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)\)。
浙公网安备 33010602011771号