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 }

 

posted @ 2022-07-24 23:09  爱吃虾滑  阅读(37)  评论(0)    收藏  举报