前缀和

#前缀和

一维前缀和

针对问题

输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l, r。对于每个询问,输出原序列中从第l个数到第r个数的和。

对数据的要求

nlr大小约为1e6,即能开数组存放序列a[n]

代码实现

const int N = 1e6 +10;  
int sum[N], a[N];  
for(int i=0; i<N; i++){  
    scanf("%d", &a[i]);  
}  
sum[0] = a[0];  
for(int i=1; i<N; i++){  
    sum[i] = sum[i-1] + a[i];  
}  
int n;  
scanf("%d", &n);  
for(int i=0; i<n; i++){  
    scanf("%d%d", &l, &r);  
    printf("%d\n", sum[r]-sum[l-1]);  
}

原理

sum[i]存放i之前的所有数据的和,即sum[i] = a[1] + a[2] + a[3] ... a[i]

由此,从第l个数到第r个数的和 = sum[r]-sum[l-1]

Pasted image 20241017204136.png

例题

23级算法 E1 B题
洛谷 P8218 求区间和

二维前缀和

例题

洛谷 P1719 最大加权矩形

前缀和综合应用

例题

洛谷 P1314 聪明的质监员

Built with MDFriday ❤️