本文介绍了稀疏表的基本用法,以及如何在相关习题中应用它。
为什么使用稀疏表?
另外,除了 RMQ、区间最大公约数以外,区间按位与、区间按位或等问题,都能够用稀疏表高效解决。这些问题都有着某种相似之处,例如区间按位与,就是每一位都取最小值;区间按位或,就是每一位都取最大值。
类似的解决这类问题的工具还有线段树。虽然稀疏表不支持修改操作,但是其查询时间被降至常数,在处理有大量询问的问题时十分有效。
如何使用稀疏表?
给出一个序列,每次询问要求回答出某个区间中最大值和最小值之差。
模板题,需要维护两张稀疏表,一张用于查询区间最大值,另一张用于查询区间最小值。查询后相减得到答案。
这题中稀疏表的地位很明确——只是个小工具,用于查询 $X$ 和 $Y$ 年之间的最大降雨量。这题的重头戏在于有些年份的降雨量是未知的,所以回答可能是 “无法判断”。
代码中的关键点、我曾经忘记考虑的点,都补上了注释,便于查看。