AcWing 99. 激光炸弹

AcWing 99. 激光炸弹

一、题目描述

地图上有 N 个目标,用整数 Xi,Yi 表示目标在地图上的位置,每个目标都有一个价值 Wi

注意:不同目标可能在同一位置。

现在有一种新型的激光炸弹,可以摧毁一个包含 R×R 个位置的正方形内的所有目标。

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

求一颗炸弹 最多 能炸掉地图上 总价值为多少 的目标。

输入格式
第一行输入正整数 NR,分别代表地图上的目标数目和正方形包含的横纵位置数量,数据用空格隔开。

接下来 N 行,每行输入一组数据,每组数据包括三个整数 Xi,Yi,Wi,分别代表目标的 x 坐标,y 坐标和价值,数据用空格隔开。

输出格式
输出一个正整数,代表一颗炸弹最多能炸掉地图上目标的总价值数目。

数据范围
0R109
0<N10000
0Xi,Yi5000
0Wi1000

输入样例

2 1
0 0 1
1 1 1

输出样例

1

二、坑点

  • 想使用二维前缀和,不能使用原数组+前缀和数组的办法,因为每个数组是5000×5000这么大,就是5000×5000×4bytes5000×5000×4/1024/1024=95MB,这题的空间是168MB,所以两个数组会MLE,一个数组就行了,在自己身上求前缀和

  • x,y坐标是从0开始的,我们一般的一维前缀和、二维前缀和,下标是从1开始的,需要做一下坐标的+1变换

  • 炸弹的范围会超过5000,而且如果是范围是0直接返回0

三、二维前缀和

假设在一个二维平面上,每个点具有一定的权值,我们要计算点(22)(84)的权值和

首先我们要找到这么几块面积:

我们可以发现,我们所要求的黄色区域,就是 黑色 - 绿色 - 粉色 + 青色

我们把(xi,yi)作为一个格子,但是实际上他们只是一个点,所以说我们不妨认为这个点就是这个格子的中心,既然如此的话我们就可以认为是(xi+0.5,yi+0.5)

四、实现代码

#include <bits/stdc++.h>
using namespace std;

const int N = 5010, M = 5001;
// 前缀和数组
int s[N][N];

int main() {
    // n:点的数量,R:边长
    int n, R;
    cin >> n >> R;

    // 这里本题数据有些坑,R有时输入会比我们整个矩阵大,所以这里设置输入的R过大,就直接取M
    R = min(R, M); // R太大,对于我们来说没有意义,因为它>5001时,就把所有位置全部摧毁掉~

    for (int i = 1; i <= n; i++) {
        int x, y, w;
        cin >> x >> y >> w;
        // 因为每题的(x,y)是默认下标从0开始,与前缀和的习惯不太相符,所以,这里直接将原坐标x+1,y+1,映射到下标从(1,1)开始
        x++, y++;     // 0≤Xi,Yi≤5000
        s[x][y] += w; // 不同目标可能在同一位置,s数组同时也充当了a数组
    }

    // 二维前缀和公式
    for (int i = 1; i <= M; i++)
        for (int j = 1; j <= M; j++)
            s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];

    // 枚举所有边长为R的正方形,取最大值就OK了(枚举的是右下角) => (R-1)*(R-1)的矩阵
    int res = 0;
    for (int i = R; i <= M; 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 @   糖豆爸爸  阅读(99)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2021-06-28 洛谷 P1403 [AHOI2005]约数研究
2015-06-28 太经典的当爸爸过程
2013-06-28 Commons IO方便读写文件的工具类
Live2D
点击右上角即可分享
微信分享提示