NC20032 激光炸弹

NC20032 HNOI2003]激光炸弹

https://ac.nowcoder.com/acm/problem/20032

一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标。

现在地图上有n(N ≤ 10000)个目标,用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置,每个目标都有一个价值。

激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为R的正方形的边必须和x,y轴平行。

若目标位于爆破正方形的边上,该目标将不会被摧毁。

  • 二维前缀和,枚举右下角边长为R的矩形即可
#define debug
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif


#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>
#define MAXN (5120)
#define ll long long int
#define INF (0x7f7f7f7f)
#define QAQ (0)

using namespace std;

#ifdef debug
#define show(x...) \ do { \ cout << "\033[31;1m " << #x << " -> "; \ err(x); \ } while (0)
void err() { cout << "\033[39;0m" << endl; }

template<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }
#endif

int n, m, Q, K, mtx[MAXN][MAXN], sum[MAXN][MAXN], N;

int main() {
#ifdef debug
	freopen("test", "r", stdin);
	clock_t stime = clock();
#endif
	scanf("%d %d ", &m, &K);
	while(m--) {
		int r, c, w;
		scanf("%d %d %d ", &r, &c, &w);
		r ++, c ++;
		mtx[r][c] += w;
		N = max(N, max(r, c));
	}
	for(int i=1; i<=N; i++)
		for(int k=1; k<=N; k++)
			sum[i][k] = mtx[i][k]+sum[i-1][k]+sum[i][k-1]-sum[i-1][k-1];

	//枚举右下角点
	int ans = 0;
	for(int i=K; i<=N; i++) 
		for(int k=K; k<=N; k++) {
			int tsum = sum[i][k] + sum[i-K][k-K]
						- sum[i-K][k] - sum[i][k-K];
			ans = max(ans, tsum);
		}
	printf("%d\n", ans);

// for(int i=1; i<=N; i++)
// forarr(mtx[i], 1, N);

#ifdef debug
	clock_t etime = clock();
	printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif 
	return 0;
}


全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务