前缀和练习
约 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";
}
判断“该不该用前缀和”的信号:题目多次询问区间和、且数组不再改动。若中途还要修改元素,前缀和就得重建,那就要换更高级的数据结构了。
小纸条
要多次询问不同区间的和,先做什么准备最划算?
登录 后可看答案