前缀和算法详解
模板
#include<iostream>
using namespace std;
const int N=100010;int a[N];
long long sum[N];//这里的long long不要丢,前缀和可能很大int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];while(m--){int l,r;scanf("%d%d",&l,&r);printf("%d\n",sum[r]-sum[l-1]);}return 0;
}
记住核心的一句:
sum[r]-sum[l-1]
二维前缀和:
//子矩阵的和
#include<iostream>
using namespace std;
const int N=1010;
int n;//行数
int m;//列数
int q;//q个询问
int a[N][N];
long long sum[N][N];int main()
{cin>>n>>m>>q;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)//关键1:sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+a[i][j];for(int i=1;i<=q;i++){int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2;//关键2:cout<<sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1]<<endl;}return 0;
}