前缀和
1.一维前缀和
引入:有一串长度为n的数列a1,a2,a3......an,再给出m个询问,每次询问给出L,R两个数,要求给出区间[L,R]里的数的和
朴素方法:对于m次询问,每次都遍历一遍所给的区间,计算出答案,时间复杂度O(n*m);
利用前缀和:我们定义前缀和sum[i]表示a1+a2+...+ai;区间[L,R]里的数的和即为sum[R]-sum[L-1],时间复杂度降到O(n+m);
void init()
{
sum[0]=0;
for(int i=1;i<=n;i++)
sum[i]=sum[i-1]+a[i];
}
void query(int l,int r)
{
return sum[r]-sum[l-1];
}
2.二维前缀和
引入:如图所示,有一个n*m的数字矩阵,给出q个询问,每次询问给出x1,x2,y1,y2四个数,要求给出区间[x1,y1][x2,y2]里的数的和
朴素方法:对于q次询问,每次都遍历一遍所给的区间,计算出答案,时间复杂度O(n*m*q)</