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改一下定义就是了。