P2280 [HNOI2003]激光炸弹[前缀和]

题目描述

img

输入输出格式

输入格式:

输入文件名为input.txt

输入文件的第一行为正整数n和正整数R,接下来的n行每行有3个正整数,分别表示 xi,yi ,vi 。

输出格式:

输出文件名为output.txt

输出文件仅有一个正整数,表示一颗炸弹最多能炸掉地图上总价值为多少的目标(结果不会超过32767)。

输入输出样例

输入样例#1:

2 1
0 0 1
1 1 1

输出样例#1:

1

解析:

如你所见,这是一个暴力。

枚举正方形右下角位置,前缀和优化到\(O(n^2)\),空间也压一下(这题卡空间)。

参考代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 5010
#define MOD 2520
#define E 1e-12
using namespace std;
int sum[N][N],n,R;
inline int read()
{
	int f=1,x=0;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
int main()
{
	n=read(),R=read();
	int r=0,c=0;
	for(int i=1;i<=n;i++){
		int x,y,v;
		x=read(),y=read(),v=read();
		sum[++x][++y]+=v;
	}
	for(int i=1;i<=5001;i++)
	 for(int j=1;j<=5001;j++)
	 	sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
	int ans=0;
	for(int i=0;i<=5000;i++)
	 for(int j=0;j<=5000;j++)
	  	if(i>=R&&j>=R)ans=max(ans,sum[i][j]-sum[i][j-R]-sum[i-R][j]+sum[i-R][j-R]);
	cout<<ans<<endl;
	return 0;
}
posted @ 2019-07-07 19:32  DarkValkyrie  阅读(159)  评论(0编辑  收藏  举报