Descripción del título
Ingrese una matriz entera con n filas ym columnas, y luego ingrese consultas Q. Cada consulta contiene cuatro enteros x1, y1, x2, y2, que representan las coordenadas superior izquierda e inferior derecha de una submatriz.
Para cada consulta, se emite la suma de todos los números en la submatriz.
Formato de entrada
La primera línea contiene tres enteros n, m, q.
Las siguientes n filas, cada fila contiene m enteros, representan una matriz entera.
Las siguientes q líneas, cada línea contiene cuatro enteros x1, y1, x2, y2, que representan un grupo de consultas.
Formato de salida
Hay q líneas en total, y cada línea genera el resultado de una consulta.
Rango de datos
1≤n, m≤1000,
1≤q≤200000,
1≤x1≤x2≤n,
1≤y1≤y2≤m,
−1000≤valor de elementos en la matriz ≤1000
Entrada de muestra:
3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4
Salida de muestra:
17
27
21
Ideas para resolver problemas
Esta pregunta es el prefijo bidimensional y
Prefijo e inicialización
Para el punto de A i, j, la suma es
s [i] [j] = s [i-1] [j] + s [i] [j-1] - s [i-1] [j-1] + a [i] [j]
Prefijo y fórmula de recursión
Para dos puntos, x1, y1, x2, y2; la suma entre ellos es
s [x2] [y2] - s [x2] [y1-1] - x [x1-1] [y2] + s [x1-1] [y1-1]
Implementación de código
#include<iostream>
using namespace std;
const int N =1010;
int a[N][N],s[N][N];
int n,m,q;
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
//初始化前缀和
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
s[i][j] = s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
while(q--)
{
int res = 0;
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
res = s[x2][y2] - s[x2][y1-1] - s[x1-1][y2] +s[x1-1][y1-1];
cout<<res<<endl;
}
return 0;
}