关于树状数组的姿势

Q:博主为什么突然会来一个这么SB的算法。
A:当然是为了水一篇博客辣 有什么新发现,顺便补上我欠树状数组的一篇总结。

树状数组

树状数组作为一种数据结构,相比其他数据结构代码清晰简单,这里就不再阐述,它可以用来解决求前缀极值或区间和,并支持插入一个数和区间增减。

(来自蒟蒻的)新姿势

今天参加了某高校的模拟赛,看当场rank1的代码……
一个小时后……
谁来恭喜我发现了一个很有用 (鸡肋)的姿势。

当我们需要多次调用树状数组时,显然是要清数组a的,这时……
蒟蒻:直接memset。

然而神犇都是用时间戳记录的。
什么是时间戳?
时间戳就是记录这是第几次调用树状数组的标志,在修改时如果发现当前的节点的时间戳不在当前时间就提前清零,如果询问时发现当前的节点的时间戳不在当前时间显然需要忽视这个节点,这样的操作类似于一种lazy思想——当修改时才清除当前节点。

这样的话在多次需要树状数组时就可以减少大量的不必要操作,起到十分显著的优化效果。

题外话

时间戳是一种优秀的优化方式,其运用不仅局限于树状数组,在二分图匹配中也有一定的运用,比如BZOJ 1854这道题,裸的二分图匹配,但是普通写法不断TLE。

我们知道二分图匹配每次DFS都要清vis数组,但使用时间戳记录就可以了,标记节点访问的时间,这样判断一个节点是否访问过判断节点记录的时间就可以了,这样起到极大的优化效果。

尽管以上时间戳在算法中的充当的成分并不一样,但是不可否认时间戳的强大

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值