输入

第一行n和m,表示行数和列数
接下来n行表示矩阵
再来一行一个整数q,表示询问个数
接下来q行,每行四个整数x1,y1,x2,y2表示左上右下的坐标

 

输出

对于每个询问输出一个整数表示该矩阵范围内的整数和

 

输入示例

5 5
1 2 5 4 1
1 1 7 6 8
8 7 9 5 2
4 4 4 1 8
5 10 11 13 7
3
2 1 4 3
2 2 5 5
4 1 5 4

 

输出示例

45
103
52

 

n,m < 2001
q < 100001
矩阵内所有数小于2000

 

前缀和,区间覆盖问题。想一想数学中的集合与公共面积。

 

 1 #include<iostream>
 2 #define ll long long
 3 using namespace std;
 4 int a,b;
 5 int x,y,x1,y1;
 6 ll n[2050][2050];
 7 int read()
 8 {
 9     int x=0,f=1;
10     char ch=getchar();
11     while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
12     while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
13     return x*f;
14 }
15 int main()
16 {
17     a=read();
18     b=read();
19     for(int i=1;i<=a;i++)
20         for(int j=1;j<=b;j++)
21         {
22             n[i][j]=read();
23             n[i][j]=n[i][j]+n[i][j-1]+n[i-1][j]-n[i-1][j-1];
24         }
25     int q;
26     q=read();
27     for(int i=0;i<q;i++)
28     {
29         x=read();
30         y=read();
31         x1=read();
32         y1=read();
33         ll ans=n[x1][y1]-n[x1][y-1]-n[x-1][y1]+n[x-1][y-1];
34         printf("%lld\n",ans);
35     }
36     //system("pause>nul");
37     return 0;
38 }
View Code