P2280 [HNOI2003]激光炸弹

由于正方形边上的目标不会摧毁,所以如果按照左图的形式来投放炸弹,实际只能摧毁\((R-1)\times(R-1)\)个点,但如果按照右图的形式来投放炸弹,则能摧毁\(R\times R\)个目标,题目要求摧毁总价值最大的边长为\(R\)的正方型区域,显然按右图的形式来计算。

采用二维前缀和计算。

const int N=5010;
int s[N][N];
int n,m;

int main()
{
	int T,r;
	cin>>T>>r;
	
	n=m=r;
	while(T--)
	{
		int x,y,w;
		scanf("%d%d%d",&x,&y,&w);
		x++,y++;
		n=max(x,n),m=max(m,y);
		s[x][y]+=w;
	}
	
	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];
			
	int res=0;
	for(int i=r;i<=n;i++)	
		for(int j=r;j<=m;j++)
			res=max(res,s[i][j]-s[i-r][j]-s[i][j-r]+s[i-r][j-r]);
			
	printf("%d\n",res);
	
	return 0;
}
posted @ 2021-04-04 11:07  Dazzling!  阅读(94)  评论(0编辑  收藏  举报