Bomba de laser C ++ (soma de prefixo bidimensional)

Existem N alvos no mapa. Use inteiros Xi, Yi para representar a posição do alvo no mapa. Cada alvo tem um valor Wi.
Observação: destinos diferentes podem estar no mesmo local.
Existe um novo tipo de bomba a laser que pode destruir todos os alvos em um quadrado contendo posições R × R.
O lançamento das bombas laser é feito por satélites, mas tem a desvantagem de seu alcance de explosão, ou seja, os lados do quadrado devem ser paralelos aos eixos xey.
Se o alvo estiver do lado do quadrado de detonação, o alvo não será destruído.
Qual é o valor máximo do alvo no mapa que pode ser destruído por uma bomba.
Formato de entrada
Insira os números inteiros positivos N e R na primeira linha, que representam o número de alvos no mapa e o comprimento lateral do quadrado, respectivamente.Os dados são separados por espaços.
Nas próximas N linhas, insira um conjunto de dados em cada linha. Cada conjunto de dados inclui três inteiros Xi, Yi, Wi, que representam a coordenada x, a coordenada y e o valor do destino, e os dados são separados por espaços.
Formato de
saída Produz um número inteiro positivo, que representa o valor total de uma bomba que pode explodir o alvo no mapa.
Faixa de dados
0≤R≤109
0 <N≤10000,
0≤Xi, Yi≤5000
0≤Wi≤1000
Exemplo de entrada:
2 1
0 0 1
1 1 1
Exemplo de saída:
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;
}

Acho que você gosta

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