iefnah06

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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\),单点求值。

实现

https://ideone.com/iG5Upp

(为了代码短,实现得和上面说的不太一样)

posted on 2020-04-09 18:31  iefnah06  阅读(92)  评论(0)    收藏  举报