0
点赞
收藏
分享

微信扫一扫

【前缀和】二维前缀和

A邱凌 2022-03-12 阅读 97

题目:激光炸弹

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 5010; 

int w[N][N];

int main(){
	
	int n, r;
	int x,y,W, max_x,max_y;
	cin >> n >> r;
	
	r = min(5001,r);

    //max_x ,max_y先初始化为r,因为要找的区域必须是大于r的区域的,否则后面的answer没法被更新
	max_x  = max_y = r;
	while(n--){
		cin >> x >> y >> W;
		x++,y++;
		w[x][y] += W;
		max_x = max(x,max_x);
		max_y = max(y,max_y);
	}

    //注意等于max_x和max_y
	
	for(int i = 1; i <= max_x; i++){
		for(int j =1; j <= max_y; j++){
			w[i][j] = w[i][j]+w[i-1][j]+w[i][j-1]-w[i-1][j-1];
		}
	}
	
	int answer = 0;
	for(int i = r; i <= max_x; i++){
		for(int j =r; j <= max_y; j++){
			answer = max(answer,w[i][j]-w[i-r][j]-w[i][j-r]+w[i-r][j-r]);
		}
	}
	
	cout << answer;
	return 0;
}

 

举报

相关推荐

0 条评论