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 imes 10^5)
时限4s。

Solution

Thinking 1

考虑(1 le n,m,w le 2 imes 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改一下定义就是了。
原文地址:https://www.cnblogs.com/luyiming123blog/p/15133729.html