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;
}