[HNOI2003]激光炸弹---二维前缀和

2023-10-10 00:05

本文主要是介绍[HNOI2003]激光炸弹---二维前缀和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

一种新型的激光炸弹,可以摧毁一个边长为 m 的正方形内的所有目标。现在地图上有 n 个目标,用整数 xi​ , yi​ 表示目标在地图上的位置,每个目标都有一个价值 vi​ .激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为 m 的边必须与 x 轴, y 轴平行。若目标位于爆破正方形的边上,该目标不会被摧毁。

现在你的任务是计算一颗炸弹最多能炸掉地图上总价值为多少的目标。

输入格式

输入的第一行为整数 n 和整数 m,

接下来的 n 行,每行有 3 个整数 x,y,v,表示一个目标的坐标与价值。

输出格式

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

样例 #1

样例输入 #1

2 1
0 0 1
1 1 1

样例输出 #1

1

提示

数据规模与约定
  • 对于 100% 的数据,保证 1≤n≤10^4,0≤xi​,yi​≤5×10^3,1≤m≤5×10^3,1≤vi​<100。

解题思路

看完题目可知就是在一个二维数组中,随机在某个位置增加某个数,然后求在 m x m 的正方形区域内二维数组的和的最大值是多少?

对于这种需要求到某个矩阵的子矩阵就需要想到二维前缀和

我们先来回忆前缀和的初始化和求子矩阵的和的公式

S[ i ][ j ] = S[ i - 1 ][ j ] + S[ i ][ j - 1 ] - S[ i - 1 ][ j - 1 ] + a [ i ][ j ]; //前缀和初始化

S[ x2 ][ y2 ] - S[ x1 - 1 ][ y2 ] - S[ x2 ][ y1 - 1 ] + S[ x1 - 1 ][ y1 - 1 ] //求子矩阵的和

好,上代码!

#include <iostream>using namespace std;int n, m;
const int N = 5010;
int a[N][N];
//int s[N][N]; //用两个数组内存可能会超,只需要将s[N][N]替换为a[N][N]就可以了
int main(void)
{scanf("%d%d", &n, &m);while (n--){int x = 0, y = 0;int v = 0;scanf("%d%d%d", &x, &y, &v);a[x + 1][y + 1] += v;  //因为前缀和的下标都是从1开始的(防止边界问题)}for (int i = 1; i < N; i++) //求前缀和,循环次数不一定为我这样的{for (int j = 1; j < N; j++){a[i][j] = a[i][j - 1] + a[i - 1][j] + a[i][j] - a[i - 1][j - 1];}}int max = -1;//写法一,我个人是比较推荐写法二,数组不容易越界for (int i = 1; i < N - m; i++) //循环次数不一定为我这样的{for (int j = 1; j < N - m; j++){//x2=i+m-1 y2=j+m-1        x1=i y1=jint r = a[i + m - 1][j + m - 1] - a[i - 1][j + m - 1] - a[i + m - 1][j - 1] + a[i - 1][j - 1];if (r >= max){max = r;}}}/* 写法二for (int i = m; i < N ; i++){for (int j = m; j < N ; j++) {//x2 = i     y2 = j     x1 = i-m+1     y1 = j-m+1int r = a[i ][j ] - a[i ][j -m] - a[i - m ][j ] + a[i - m ][j - m];if (r >= max){max = r;}}}*/printf("%d\n", max);return 0;
}

在做这题时,我在求子矩阵的和时,因为数组的边界出了很多问题,所以出错了可以先看看数组是否越界了

在排除错误的过程中还可以先打印 5行5列看看数组是怎么样的,分别在输入后求前缀和之前  和  求前缀和之后 打印

代码

for (int i = 1; i <= 5; i++)
{for (int j = 1; j <= 5; j++){printf("%d ", a[i][j]);}printf("\n");
}

这篇关于[HNOI2003]激光炸弹---二维前缀和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/176506

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

【LeetCode热题100】前缀和

这篇博客共记录了8道前缀和算法相关的题目,分别是:【模版】前缀和、【模版】二维前缀和、寻找数组的中心下标、除自身以外数组的乘积、和为K的子数组、和可被K整除的子数组、连续数组、矩阵区域和。 #include <iostream>#include <vector>using namespace std;int main() {//1. 读取数据int n = 0, q = 0;ci

二维旋转公式

二维旋转公式 ros的tf工具包可以很方便的实现任意坐标系之间的坐标转换。但是,如果只是想简单的测试想法,而又不想编写过于庞杂的代码,考虑自己写二维旋转的函数。而与二维旋转问题对偶的另一个问题便是二维坐标系旋转变换。这两个问题的形式基本一样,只是旋转的角度相差一个负号。就是这个容易搞混,所以做个笔记,以备查用。 1. 二维旋转公式(算法) 而(此文只针对二维)旋转则是表示某一坐标点 ( x

C语言批量数据到动态二维数组

上一篇文章将文件读取放到静态创建的二维数组中,但是结合网络上感觉到今天的DT时代,这样批量大量读取一个上百行的数据,分配的内存是否可能因为大量的数据而产生溢出呢,最近一直研究里malloc函数,通过它来动态建立所需的二维数组,因此,通过文件操作和动态创建二维数组结合起来,将大量的数据动态的放入矩阵中,不知道这样的思想是否正确,下午把程序运行出来了,将程序贴上来,欢迎大家一起探讨:对于有规律的大数据

前缀和 — 利用前缀信息解决子数组问题

【前缀和的核心思想是预先处理数组来快速计算任意子数组的和,基本上用于数组和序列问题。】 前缀和算法具体步骤 构造前缀和数组: 给定一个数组nums,其前缀和数组prex定义为prex[i]表示为数组nums从起始位置到第i个位置的元素累加和。构建前缀和公式: p r e x [ i ] = n u m s [ i ] ( i = = 0 ) p r e x [ i ] = p r e x

三维激光扫描点云配准外业棋盘的布设与棋盘坐标测量

文章目录 一、棋盘标定板准备二、棋盘标定板布设三、棋盘标定板坐标测量 一、棋盘标定板准备 三维激光扫描棋盘是用来校准和校正激光扫描仪的重要工具,主要用于提高扫描精度。棋盘标定板通常具有以下特点: 高对比度图案:通常是黑白相间的棋盘格,便于识别。已知尺寸:每个格子的尺寸是已知的,可以用于计算比例和调整。平面标定:帮助校准相机和激光扫描仪之间的位置关系。 使用方法 扫描棋盘:

HLJUOJ1118(二维树状数组)

1118: Matrix Time Limit: 4 Sec   Memory Limit: 128 MB Submit: 77   Solved: 12 [ Submit][ Status][ Web Board] Description 给定一个1000*1000的二维矩阵,初始矩阵中每个数都为1,然后为矩阵有4种操作. S x1 y1 x2 y2:计算(x1,y1)、(x2