【LOJ3325】「SNOI2020」区间和

这篇博客探讨了如何使用SegmentTreeBeats数据结构处理区间修改和询问操作,特别是针对区间最小值的区间加操作。通过维护左L、中M、右R和和S的数据,以及区间最小值的个数Mincnt和Mintimer,实现了在增加区间最小值过程中寻找最优解的算法。时间复杂度分析提到,总操作次数不超过O(NLogN),而每次DFS的时间复杂度为O(LogN)。
摘要由CSDN通过智能技术生成

题目链接

点击打开链接

题目解法

由于修改操作是区间 chkmax ,不难想到用 SegmentTreeBeats 来维护序列。
接下来,我们便只需要考虑如何处理对区间最小值的区间加操作了。

参考最大子段和的传统线段树解法,同样考虑维护左 L L L 、中 M M M 、右 R R R 、和 S S S 四项数据。
在这四项数据中,我们不仅要计入最优解的数值 s u m sum sum ,同时还要记录最优解包含的区间最小值的个数 M i n c n t Mincnt Mincnt

在一个区间的区间最小值不断增加的过程中,有一些包含更多区间最小值的区间有可能逐渐变得优于原有的最优解。因此,有时我们不得不递归入一些节点的子树,重新计算最优解。
由此,考虑维护 M i n t i m e r Mintimer Mintimer 表示区间最小值至少要增长到何值时,才要递归入子树中重新计算最优解。 M i n t i m e r Mintimer Mintimer 可由子树的 M i n t i m e r Mintimer Mintimer ,以及合并两个子树的 L , M , R , S L,M,R,S L,M,R,S 的过程算得。

由此,我们可以支持修改和询问,得到了一个正确的算法。

考虑分析其时间复杂度。
每当一个节点被递归进入子树,其子树内的至少一个点的 L , M , R , S L,M,R,S L,M,R,S 中的至少一者的 M i n c n t Mincnt Mincnt 将会至少增加 1 1 1 ,因此,向下 DFS 的总次数应当不超过线段树上的区间总长,也即 O ( N L o g N ) O(NLogN) O(NLogN) 。每次 DFS 至多花费 O ( L o g N ) O(LogN) O(LogN) 的时间。

更新:经过和 djq 的讨论,上面的复杂度分析存在一定问题
考虑用两种方式分析 L , R L,R L,R M M M 对复杂度的贡献。
对于 L , R L,R L,R ,注意到一个节点的 L , R L,R L,R 对应的区间长度是单调不降的, L , R L,R L,R 被修改的总次数是 O ( N L o g N ) O(NLogN) O(NLogN) 的。对于 M M M ,考虑对每个节点定义势能函数 f i f_i fi ,表示当前的 M M M 是三个可选的 M M M (左子树,右子树,拼接)中 M i n c n t Mincnt Mincnt 排名第 1 / 2 / 3 1/2/3 1/2/3 大的,则 L , R L,R L,R 的势能每减小 1 1 1 ,只有对应节点祖先的势能可能增加。

时间复杂度 O ( N

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值