[Base del algoritmo de Acwing] Suma de prefijo 2.5

Suma de prefijo unidimensional

  1. Cómo encontrar Si: Ligeramente
  2. ¿Para qué se utiliza el Si?
    • Encuentre rápidamente la suma de los números en la matriz original

solución

Muy simple

#include <iostream>

using namespace std;

const int N = 100010;

int n, m;
int a[N], s[N];

int main()
{
    
    
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
        
    for (int i = 1; i<= n; ++i)
        s[i] = s[i - 1] + a[i];
    
    while (m--)
    {
    
    
        int l, r;
        scanf("%d%d", &l, &r);
        printf("%d\n", s[r] - s[l - 1]);
    }
    
    return 0;
}

Suma de prefijo bidimensional

Inserte la descripción de la imagen aquí

tema

Ingrese una matriz entera con n filas ym columnas, y luego ingrese q consultas. Cada consulta contiene cuatro enteros x1, y1, x2, y2, que representan las coordenadas de la esquina superior izquierda y la esquina inferior derecha de una submatriz.

Para cada consulta, se genera la suma de todos los números de la submatriz.

Formato de entrada La
primera línea contiene tres números enteros n, m, q.

Las siguientes n filas, cada fila contiene m enteros, que representan una matriz de enteros.

En la siguiente línea q, cada línea contiene cuatro números enteros x1, y1, x2, y2, que representan un conjunto de consultas.

Formato de salida Hay
q líneas en total, y cada línea genera un resultado de consulta.

Rango de datos
1≤n, m≤1000,
1≤q≤200000,
1≤x1≤x2≤n,
1≤y1≤y2≤m,
−1000≤valor de elementos en matriz≤1000
Ejemplo de entrada:
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
Ejemplo de salida:
17
27
21

Código:

#include <iostream>

const int N = 1010;

int n, m, q;
int a[N][N], s[N][N];

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 x1, y1, x2, y2;
        scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
        printf("%d\n", s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1]);
    }
    
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_22473333/article/details/114765422
Recomendado
Clasificación