关于树状数组的姿势

来源:互联网 发布:js时间控件webdriver 编辑:程序博客网 时间:2024/05/31 05:28

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

树状数组

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

(来自蒟蒻的)新姿势

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

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

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

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

题外话

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

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

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

原创粉丝点击