P6617 Search

Problem

给一个长度为\(n\)的序列\(a\)和一个正整数\(w\)\(m\)次操作,每次操作为:

  • 1 x y 修改\(a_x\)\(y\)
  • 2 l r 查询是否存在\(i,j\)满足\(l \le i < j \le r\),且\(a_i + a_j = w\)

\(1 \le x \le n,0 \le y \le w,1 \le l \le r \le n \le 5\times 10^5\)
时限4s。

Solution

Thinking 1

考虑\(1 \le n,m,w \le 2\times 10^3\)的部分分。
每次暴力修改,然后询问搞个桶瞎搞可以做到\(\mathcal{O}(mn)\)

Thinking 2

考虑只有查询的部分分。
定义\(nxt_i = \min\{j \mid j > i,a_i + a_j = w\}\)
那么询问变为查询是否\(\min_{i = l}^r \{nxt_i\} \le r\)
\(nxt_i\)用set瞎搞一下就行了。
因为没有修改,可以用ST表搞一搞\(\min\)

Thinking 3

考虑在Thinking 2的基础上加上修改。
我们发现,对于一个修改\(x,y\),考虑会影响哪些:

  • \(nxt_x\)
  • 所有满足\(nxt_i = x\)
    我们发现第二个太毒瘤了!修改太多!
    然后xjb改一下定义就是了。
posted @ 2021-08-12 17:12  luyiming123  阅读(98)  评论(0编辑  收藏  举报