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