ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二维前缀和之激光炸弹

2020-01-25 21:53:41  阅读:258  来源: 互联网

标签:Yi 前缀 RR int 激光 目标 正方形 二维 炸弹


原题链接:https://www.acwing.com/problem/content/description/101/

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

现在地图上有 NN 个目标,用整数Xi,YiXi,Yi 表示目标在地图上的位置,每个目标都有一个价值WiWi 。

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

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

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

输入格式

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

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

输出格式

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

数据范围

0≤R≤1e9  
0<N≤10000 ,
0≤Xi,Yi≤5000
0≤Wi≤1000

输入样例:

2 1
0 0 1
1 1 1

输出样例:

1
求某点的前缀和:

 

 s[i][j]=g[i-1][j]+g[i][j-1]-g[i-1][j-1]+g[i][j];


二维前缀和:

 

 红色部分的面积就是全部有色的面积减去绿色的面积加上黄色的面积(因为多剪了)



AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=5050;
int n1,r;
int g[maxn][maxn];
int main(){
    cin>>n1>>r;
    int x,y,w;
    int n=r,m=r;
    for(int i=0;i<n1;i++){
        cin>>x>>y>>w;
        x++,y++;
        n=max(x,n);
        m=max(y,m);
        g[x][y]=w;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            g[i][j]=g[i-1][j]+g[i][j-1]-g[i-1][j-1]+g[i][j];            
        }
    }
    int ans=0;
    int t;
    for(int i=r;i<=n;i++){
        for(int j=r;j<=m;j++){
            t=g[i][j]-g[i-r][j]-g[i][j-r]+g[i-r][j-r];//算的是边长是(r-1)的正方形的和,因为边上不加
            ans=max(ans,t);
        }
    }
    cout<<ans<<endl;
}

 

 

标签:Yi,前缀,RR,int,激光,目标,正方形,二维,炸弹
来源: https://www.cnblogs.com/lipu123/p/12233462.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有