P6617 Search

该博客讨论了一个关于序列操作的问题,其中包含修改和查询两个操作。在限制时间内,提出了针对不同情况的解决方案,包括暴力修改和使用ST表进行查询优化。在没有修改的情况下,可以通过维护一个最小值集合来高效地处理查询。当存在修改操作时,需要调整算法以适应变化,并考虑修改对查询结果的影响。
摘要由CSDN通过智能技术生成

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改一下定义就是了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值