输入
第一行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 }
时间: 2024-10-04 12:43:53