URL
https://codeforces.com/problemset/problem/765/F
解法
考虑离线做法。
移动右端点 \(r\),维护每个左端点的答案,我们想要知道选中的其中一个数字为 \(r\) 时,另外一个数字的位置取那些会对答案产生影响。
不失一般性,先假设另外一个位置的值不超过 \(A_r\),记有用的位置为 \(l_0<l_1<\ldots<l_k<r\),显然这些位置的 \(A\) 应该是递减的。
此时如果存在 \(l_i\) 使得
\[A_{l_i}-A_{l_{i+1}} \le A_r-A_{l_i}
\]
\(l_i\) 就是冗余的。否则
\[A_{l_i}-A_{l_{i+1}} > A_r-A_{l_i} \implies 2(A_r-A_{l_i})<A_r-A_{l_{i+1}}
\]
就是说差每次折半,这样就把有用的 \(l\) 个数降到 \(O(\log{A})\) 级别了。
找 \(l\) 可以用一个线段树存一段区间对应的最大下标(显然范围内最大的下标才有用)。
维护答案可以用线段树做区间取 \(\min\),单点求值。
实现
(为了代码短,实现得和上面说的不太一样)