前缀和练习

8 分钟

前缀和的精髓是一句话:预处理一次,之后每次查询都很快。建表要 ,但建好后每次区间求和只要

假设一道题有 次询问,每次问某段区间的和:

  • 不用前缀和:每次现加,单次 ,总共
  • 用前缀和:建表 ,每次查询 ,总共

都到 时,前者约 次运算必然超时,后者只有约 次,轻松通过。

// 建表一次,回答 q 次询问
for (int i = 1; i <= n; i++) s[i] = s[i-1] + a[i];
while (q--) {
    int l, r; cin >> l >> r;
    cout << s[r] - s[l-1] << "\n";
}

判断“该不该用前缀和”的信号:题目多次询问区间和、且数组不再改动。若中途还要修改元素,前缀和就得重建,那就要换更高级的数据结构了。

小纸条

要多次询问不同区间的和,先做什么准备最划算?

登录 后可看答案