[NOI2005] 维护数列(Splay)

这篇博客详细介绍了如何使用 Splay 树解决 NOI2005 中的一个数列维护问题。涉及到的操作包括插入、删除、修改、翻转和求最大子列和,并探讨了 Splay 树的关键技巧和注意事项,如区间翻转、区间删除等。在实际操作中,特别强调了哨兵节点的使用、节点排名的计算以及在维护过程中标记的影响。
摘要由CSDN通过智能技术生成

题意

要求维护一个数列,支持以下操作:
在这里插入图片描述
其中,插入总数字个数小于 4 e 6 4e6 4e6,每个数在 [ − 1000 , 1000 ] [-1000,1000] [1000,1000] 范围,保证每次操作合法。

分析

这道题是一道 S p l a y Splay Splay 码农题,细节颇多,让我们一个一个操作分析。

  • 插入操作
    我们可以先对要插入的这 t o t tot tot 个数建树,得到树根 t r t trt trt,再将 t r t trt trt 插入原序列。
  • 删除操作
    就是普通的删除,将 r + 1 r+1 r+1 旋到根,将 l − 1 l-1 l1 旋到根的右儿子,然后 l − 1 l-1 l1 的儿子置为 0 0 0 即可。(这里的 l , r l,r l,r 指的是排名,不是值)
  • 修改操作
    同理,只要给 l − 1 l-1 l1 的儿子加个 t a g tag tag 即可。
  • 翻转操作
    同理,也是加个 t a g tag tag。但需要注意的是,翻转的时候,需要将最大前缀和和最大后缀和交换!
  • 求和操作
    过于简单,因此省略。
  • 最大子列和
    这个和 小白逛公园 的原理是一样的,就是利用分治,维护区间的最大子段和,区间和,区间最大前缀和,区间最大后缀和。
    在这里,我们定义,最大前缀和和最大后缀和可以为空,子段和不能为空。

然后就是码码码…

借此题总结一下 Splay 的一些技巧和注意点

  • S p l a y Splay Splay 支持的操作包括区间翻转,区间删除,区间平移,区间交换,线段树能实现的功能 s p l a y splay splay 都能实现。
  • 先在首尾建两个哨兵节点,防止 s p l a y splay splay 操作出错,有时候要给哨兵节点赋初始值
  • 对于位置 p p p,它的排名为 p + 1 p+1 p+1(因为有哨兵节点),它对应的节点为 k t h ( r o o t , p + 1 ) kth(root, p + 1) kth(root,p+1);节点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值