Bomba láser C ++ (suma de prefijo bidimensional)

Hay N objetivos en el mapa. Utilice los números enteros Xi, Yi para representar la posición del objetivo en el mapa. Cada objetivo tiene un valor Wi.
Nota: diferentes objetivos pueden estar en la misma ubicación.
Hay un nuevo tipo de bomba láser que puede destruir todos los objetivos en un cuadrado que contiene posiciones R × R.
El lanzamiento de bombas láser se localiza mediante satélites, pero tiene la desventaja de que su rango de explosión, es decir, los lados del cuadrado deben ser paralelos a los ejes xey.
Si el objetivo está en el lado de la casilla de explosión, el objetivo no será destruido.
¿Cuál es el valor máximo del objetivo en el mapa que puede ser destruido por una bomba?
Formato de entrada
Introduzca los números enteros positivos N y R en la primera línea, que representan el número de objetivos en el mapa y la longitud del lado del cuadrado, respectivamente. Los datos están separados por espacios.
En las siguientes N líneas, ingrese un conjunto de datos en cada línea. Cada conjunto de datos incluye tres números enteros Xi, Yi, Wi, que representan la coordenada x, la coordenada y y el valor del objetivo, y los datos están separados por espacios.
Formato de
salida Genera un número entero positivo, que representa el valor total de una bomba que puede hacer estallar al objetivo en el mapa.
Rango de datos
0≤R≤109
0 <N≤10000,
0≤Xi, Yi≤5000
0≤Wi≤1000
Ejemplo de entrada:
2 1
0 0 1
1 1 1
Ejemplo de salida:
1

Código AC:

#include<stdio.h>
#include<algorithm>

using namespace std;

int n,r;
int X=0,Y=0;
int s[5010][5010];
int ans=0;

int main()
{
    
    
    scanf("%d%d",&n,&r);
    r=min(5001,r);
    int x,y;
    int num;
    X=Y=r;
    while(n--)
    {
    
    
        scanf("%d%d%d",&x,&y,&num);
        ++x;++y;
        s[x][y]+=num;//不同目标可能在同一位置
        X=max(X,x);Y=max(Y,y);
    }
    for(int i=1;i<=X;++i)//求前缀和
    {
    
    
        for(int j=1;j<=Y;++j)
            s[i][j]+=s[i][j-1]+s[i-1][j]-s[i-1][j-1];
    }
    for(int i=r;i<=X;++i)//枚举r*r正方形
    {
    
    
        for(int j=r;j<=Y;++j)
        {
    
    
            //s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]
            //x1是i-(r-1),y1是j-(r-1)
            ans=max(ans,s[i][j]-s[i][j-r]-s[i-r][j]+s[i-r][j-r]);
        }
    }
    printf("%d",ans);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_44643644/article/details/108815740
Recomendado
Clasificación