AcWing 795. 前缀和
听名字就是 数组当前位置 内部存的数 是他之前及本身的 和
原本a[10]存的自己 现在 sum[0]=a[0],sum[1]=a[0]+a[1];以此类推。
AC代码
#include<iostream>
using namespace std;
const int N=1e5+10;
int num[N];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
num[i]=num[i-1]+x;
}
while(m--){
int l,r;
scanf("%d%d",&l,&r);
cout<<num[r]-num[l-1]<<endl;
}
return 0;
}
AcWing 796. 子矩阵的和
就是求 二维数组给定区域 矩阵和 具体看看题意
图解 :二维 前缀和 数组的创建
与后文颜色代表含义相同
浅蓝色填充区:为浅蓝色方块区域 的和 即 深蓝色方块所在数组位置的数值
黄色区域: 第一部分 和
咖啡色区域: 第二部分和
红色方块; 黄色 和 咖啡色 公共区域
深蓝色方块: 填充区域 之和(所在数组位置的值)
橘黄色方块:黄色区域之和(所在数组位置的值)
红褐色方块:咖啡色区域之和(所在数组位置的值)
绿色方块:黄色 和 咖啡色 公共之和(所在数组位置的值)
求 填充区域之和
需要用 黄色填充区之和(橘黄色方块所在数组位置的值)加上
咖啡色区域之和(红褐色方块所在数组位置的值) 减去
黄色 和 咖啡色 公共区域之和(绿色方块所在数组位置的值) 加上
蓝色填充区 所在数组的和(未计算之前是本身非和)
图解 :计算 所求区域之和(已经求出二维前缀和数组前提下)
蓝色: 求和区域
黄色: 第一个 排除区
咖啡色: 第二个 排除区
红色矩形:排除 公共区
由于用的前缀和数组
深蓝色方块 所在数组位置为 (0,0)(xx,yy)整个填充区域的和
需要减去 黄色区域(橘黄色方块所在数组位置)再减去
咖啡色区域(红褐色方块所在数组位置) 并 加上
公共区(因为减去了两次嘛~)(绿色 方块所在数组)
AC代码
#include<iostream>
using namespace std;
con