AcWing 796.子矩阵的和
题目链接:https://www.acwing.com/activity/content/problem/content/830/
突然发现把二维前缀和这小尾巴漏了
显而易见:s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i] [j]。
由此可以推出:
那么二位前缀和的公式即:s[x2,y2] - s[x2,y1-1] - s[x1-1,y2] + s[x1-1,y1-1]。
预处理:O(nm)
查询:O(1)
放AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,q; 4 int p[1005][1005],s[1005][1005]; 5 6 int main() 7 { 8 cin>>n>>m>>q; 9 for(int i=1; i<=n; i++) 10 for(int j=1; j<=m; j++) 11 cin>>p[i][j]; 12 for(int i=1; i<=n; i++) 13 for(int j=1; j<=m; j++) 14 s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+p[i][j]; 15 while(q--) 16 { 17 int x1,y1,x2,y2; 18 cin>>x1>>y1>>x2>>y2; 19 cout<<s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]<<endl; 20 } 21 return 0; 22 }