AcWing99. 激光炸弹

题目

地图上有 N N N 个目标,用整数 X i , Y i X_i,Y_i Xi,Yi 表示目标在地图上的位置,每个目标都有一个价值 W i W_i Wi

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

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

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

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

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

输入格式

第一行输入正整数 N N N R R R,分别代表地图上的目标数目和正方形的边长,数据用空格隔开。

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

输出格式

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

数据范围

  • 0 ≤ R ≤ 1 0 9 0≤R≤10^9 0R109
  • 0 < N ≤ 10000 0<N≤10000 0<N10000
  • 0 ≤ X i , Y i ≤ 5000 0≤X_i,Y_i≤5000 0Xi,Yi5000
  • 0 ≤ W i ≤ 1000 0≤W_i≤1000 0Wi1000

输入样例

2 1
0 0 1
1 1 1

输出样例

1

分析

因为 X i , Y i X_i, Y_i Xi,Yi 的值在 0 ~ 5000 之间,所以可以建立一个二维数组 A A A,其中, A [ i ] [ j ] A[i][j] A[i][j] 就等于位置 ( i , j ) (i,j) (i,j) 上的所有目标的价值之和。即对于每个目标,令 A [ X i ] [ Y i ] + = W i A[X_i][Y_i] += W_i A[Xi][Yi]+=Wi

接下来求出 A A A 的二维前缀和 S S S,即:
S [ i ] [ j ] = ∑ x = 1 i ∑ y = 1 j A [ x ] [ y ] S[i][j] = \sum_{x=1}^{i}\sum_{y=1}^j A[x][y] S[i][j]=x=1iy=1jA[x][y]
如下图所示,再观察 S [ i ] [ j ] , S [ i − 1 ] [ j ] , S [ i ] [ j − 1 ] , S [ i − 1 ] [ j − 1 ] S[i][j],S[i-1][j],S[i][j-1],S[i-1][j-1] S[i][j]S[i1][j]S[i][j1]S[i1][j1] 的关系。
在这里插入图片描述
容易得到如下的递推式:
S [ i ] [ j ] = S [ i − 1 ] [ j ] + S [ i ] [ j − 1 ] − S [ i − 1 ] [ j − 1 ] + A [ i ] [ j ] S[i][j] = S[i-1][j] + S[i][j - 1] - S[i-1][j-1] + A[i][j] S[i][j]=S[i1][j]+S[i][j1]S[i1][j1]+A[i][j]

同理,对于任意一个边长为 R R R 的正方形,有:
∑ x = i − R + 1 i ∑ y = j − R + 1 j A [ x ] [ y ] = S [ i ] [ j ] − S [ i − R ] [ j ] − S [ i , j − R ] + S [ i − R ] [ j − R ] \sum_{x = i - R + 1}^i \sum_{y = j-R+1}^jA[x][y] = S[i][j] - S[i-R][j] - S[i, j-R] + S[i-R][j- R] x=iR+1iy=jR+1jA[x][y]=S[i][j]S[iR][j]S[i,jR]+S[iR][jR]

在这里插入图片描述

因此,只需要 O ( N 2 ) O(N^2) O(N2) 递推求出二维前缀和 S S S,然后 O ( N 2 ) O(N^2) O(N2) 枚举边长为 R R R 的正方形的右下角坐标 ( i , j ) (i,j) (i,j),即可通过上式 O ( 1 ) O(1) O(1) 计算出该正方形内所有目标的价值之和,更新答案。上面给出的两个式子蕴含的思想其实就是 “容斥原理”。

值得一提的是,上面将 ( X i , Y i ) (X_i, Y_i) (Xi,Yi) 作为一个“格子”,而原题中 ( X i , Y i ) (X_i, Y_i) (Xi,Yi) 是一个点,并且正方形边上的目标不会被摧毁。实际上,不妨认为这个点就处于 “格子” ( X i , Y i ) (X_i,Y_i) (Xi,Yi) 的中心位置,格子的左上角坐标为 ( X i − 0.5 , Y i − 0.5 ) (X_i - 0.5,Y_i-0.5) (Xi0.5,Yi0.5),右下角坐标为 ( X i + 0.5 , Y i + 0.5 ) (X_i + 0.5, Y_i + 0.5) (Xi+0.5,Yi+0.5),而正方形的右下角处于 “格线交点” 上,即一个值为 “□.5” 的坐标。这个转化与原问题是等价的。另外,本题内存限制较为严格,可以省略 A A A 数组,读入时直接向 S S S 中累加。

代码

#include <iostream>
using namespace std;

const int N = 5010;

int S[N][N]; //前缀和数组

int main() {
    int N; //目标数 或者说 点数
    int R;
    cin >> N >> R;

    R = min(R, 5001); 

    for (int i = 0, x, y, w; i < N; i++) {
        cin >> x >> y >> w;
        //为防越界,下标从1开始
        S[x + 1][y + 1] += w;
    }
    
    //求二维前缀和
    for (int i = 1; i <= 5001; i++) {
        for (int j = 1; j <= 5001; j++) {
            S[i][j] += S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1]; 
        }
    }

    //枚举边长为R的正方形
    int res = 0;
    for (int i = R; i <= 5001; i++) {
        for (int j = R; j <= 5001; j++) {
            //因为在正方形边上的不能爆破,所以实质上计算的是边长为R-1的正方形
            res = max(res, S[i][j] - S[i - R][j] - S[i][j - R] + S[i - R][j - R]); 
        }
    }
    cout << res << endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/125783.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“Git 在团队协作中的优化实践“

文章目录 引言&#xff1a;一、Git 简介1.1 Git 基本概念1.2 Git 原理与工作流程 二、 Git 与 SVN 的区别三、Git 的常用命令及操作四、Git 的理论知识&#xff1a;总结&#xff1a; 引言&#xff1a; 随着技术的不断演进和团队的不断发展&#xff0c;代码管理变得越来越重要。…

不用流氓软件,如何在户外使用手机听下载到家中电脑里的音乐文件呢?

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是本教程使用环境&#xff1a;1 群晖系统安装audiostation套件2 下载移动端app 很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿&#xff0c;于是打开手机上的某雅软件和某音乐软件点进去…

2.docker镜像的导入导出

目录 概述docker 常用命令下载导出导入镜像结束 概述 docker 常用命令 本章节使用到的命令&#xff0c;总结在此&#xff0c;后面有使用案例。 命令作用docker images显示镜像docker rmi $(docker images -q)删除系统上所有的镜像docker rmi -f强制删除多个镜像 &#xff1a…

istio 学习笔记

参考&#xff1a;istio简介和基础组件原理&#xff08;服务网格Service Mesh&#xff09;-CSDN博客 Istio 微服务框架 服务治理。 Istio的关键功能: HTTP/1.1&#xff0c;HTTP/2&#xff0c;gRPC和TCP流量的自动区域感知负载平衡和故障切换。 通过丰富的路由规则&#xf…

module ‘torch‘ has no attribute ‘_six‘

主要问题是torchvision的问题 在122服务器上的scvi-env2环境中 import torch import torch.nn as nnimport numpy as npfrom tqdm import tqdm from torchvision.utils import save_image, make_grid # Model Hyperparametersdataset_path ./datasetscuda True DEVICE tor…

小白学爬虫:通过商品ID获取1688跨境属性数据接口|1688商品属性接口|1688一件代发数据接口|1688商品详情接口

通过商品ID获取1688跨境属性数据接口可以使用1688开放平台提供的API接口实现。以下是获取跨境属性数据的基本步骤&#xff1a; 1、点击获取测试key和secret 2、构造请求参数&#xff0c;包括商品ID和其他必要参数&#xff0c;如接口权限、请求类型等。 3、通过API接口链接&…

机器视觉工程师注意,没有经历过公司倒闭看下文章,机器视觉公司即将要倒闭的征兆是什么?

很多机器视觉工程师没有经历过公司倒闭&#xff0c;谁也不想自己的公司倒闭&#xff0c;毕竟我们是打工人&#xff0c;拿固定工资的。 机器视觉公司即将要倒闭的征兆有哪些迹象​&#xff1f;​ 1、PM&#xff0c;机器视觉工程师频繁开会&#xff0c;甚至周末强制开会。 2.停…

Ubuntu中增加交换内存

前言 在运行一些代码编译或者clang-format会占用大量的内存&#xff0c;此时可能会出现电脑卡死的情况&#xff0c;在ubuntu中可以通过增加交换内存来临时解决这个问题&#xff0c;相对于硬件改动成本更低&#xff0c;但是性能不如物理内存。 实践 查看当前的交换内存大小 …

学习笔记4——JVM运行时数据区梳理

学习笔记系列开头惯例发布一些寻亲消息 链接&#xff1a;https://baobeihuijia.com/bbhj/contents/3/192489.html 类装载器classLoader&#xff1a; 将本地的字节码文件.class 加载到内存方法区中成为元数据模板&#xff08;两个class对象是否为同一个类要求&#xff1a;完整…

【组件自定义事件+全局事件总线+消息订阅与发布+TodoList案例——编辑+过度与动画】

组件自定义事件全局事件总线消息订阅与发布TodoList案例——编辑过度与动画 1 组件自定义事件1.1 绑定1.2 解绑1.3 总结1.4 TodoList案例——自定义事件 2 全局事件总线2.1 理解2.2 步骤2.3 TodoList案例——事件总线 3 消息订阅与发布3.1 理解3.2 TodoList案例——消息的订阅与…

【vite】vite.defineConfig is not a function/npm无法安装第三方包问题

当使用vite命令 npm init vite-app 项目名称时配置 import vue from vitejs/plugin-vueexport default defineConfig({plugins: [vue()] })会报错vite.defineConfig is not a function 还有就是npm下载的时候也会报错 原因vite插件vitejs/plugin-vue和vite版本问题 解决 调…

微带线的ABCD矩阵的推导、转换与级联-Matlab计算实例

微带线的ABCD矩阵的推导、转换与级联-Matlab计算实例 散射参数矩阵有实际的物理意义&#xff0c;但是其无法级联计算&#xff0c;但是ABCD参数和传输散射矩阵可以级联计算&#xff0c;在此先简单介绍ABCD参数矩阵的基本用法。 1、微带线的ABCD矩阵的推导 其他的一些常用的二端…

R-install_miniconda()卸载 | conda命令行报错及解决方法

运行以下代码&#xff0c;突然报错&#xff1a; C:\Users\hp>conda info-e >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<<<<<<<<<<&…

开发一条公链多少钱

随着区块链技术的普及和发展&#xff0c;越来越多的企业和个人开始关注公链的开发和建设。那么&#xff0c;开发一条公链到底需要多少钱呢&#xff1f; 首先&#xff0c;我们需要了解公链开发的基本流程和成本构成。一般来说&#xff0c;开发一条公链需要考虑以下几个方面&…

数字政府!3DCAT实时云渲染助推上海湾区数字孪生平台

数字孪生&#xff0c;是一种利用物理模型、传感器数据、运行历史等信息&#xff0c;在虚拟空间中构建实体对象或系统的精确映射&#xff0c;从而实现对其全生命周期的仿真、优化和管理的技术。数字孪生可以应用于各个领域&#xff0c;如工业制造、智慧城市、医疗健康、教育培训…

AVD联网

AVD联网&#xff1a; 解决Android Studio模拟器无法联网_android studio模拟器没有网络-CSDN博客 挺好的&#xff0c;就是访问网站的时候只能用ip&#xff0c;而不能用域名。 AVD设置代理&#xff1a; android studio踩坑记 AVD模拟器代理设置_android studio avd 配置代理-…

《C++ Primer》第8章 IO库

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 8.1 IO类&#xff08;P278&#xff09; 我们目前使用过的 IO 对象&#xff08;cin 、cout&#xff09;都是关联到控制台窗口、操纵 char 数据的。有时&#xff0c;我们需要对命名文件或者 string IO 操作。…

与set和map相关的OJ题练习

一、两个数组的交集 题目链接&#xff1a; 349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给两个数组&#xff0c;求在数组里面共同出现的部分&#xff0c;就是求两个数组的交集&#xff0c;返回顺序不做要求 解题思路&#xff1a; …

Centos7安装配置中文输入法

Centos7安装配置中文输入法 在安装CentOS时&#xff0c;我们为了方便使用&#xff0c;语言选择了中文&#xff0c;但是我们发现&#xff0c;在Linux命令行或者是浏览器中输入时&#xff0c;我们只能输入英文&#xff0c;无法输入汉字。 来&#xff0c;跟随脚步&#xff0c;设…

第14章,lambda表达式与流处理例题

package 例题;import java.util.List; import java.util.stream.Collectors; import java.util. stream.Stream;public class 例题19 { public static void main(String[] args){List<例题14> list 例题14.get例题14List();//获取公共类的测试数据Stream<例题14>…