前缀和
约 10 分钟
前缀和是“用空间换时间”的经典技巧:预处理出“前 项的和”,之后任意区间和都能 算出。
定义 ,约定 。那么区间 的和就是 ——一次减法搞定,不用再循环累加。
// 下标从 1 开始, s[0] = 0
for (int i = 1; i <= n; i++)
s[i] = s[i - 1] + a[i];
// 查询区间 [l, r] 的和
long long query(int l, int r) {
return s[r] - s[l - 1];
}
预处理 ,每次查询 。若有 次询问,朴素做法是 ,前缀和降到 ,数据大时差距巨大。
坑:一是下标,用 时若下标从 开始要仔细推边界,推荐数组从 存、留出 ;二是和可能很大, 要开 long long 防溢出。二维前缀和同理,用容斥算矩形和。
小纸条
区间 [l, r] 的和怎么算?
登录 后可看答案