HNOI2003 激光炸弹

题面

link

solution

水题一枚,题目意思是给出n个点,每个点有一个价值,问一个边长为r的点最大能获得多大价值。

维护一个二维前缀和即可。

如果我们要求红色部分的和,是不是用整个有颜色部分的正方形的面积S - 黄色 - 绿色 - 蓝色

那么怎么利用前缀和的知识来求呢。

二维中,前缀和代表某点相对于矩阵左上角的矩形区域的面积。

所以可以推出ans = map[5][5]-map[5][5-2-1]-map[2][5-2-1]+map[2][2]这里为什么是5-2-1 呢, 5代表要求的点, 2代表边长

这道题有一个坑,就是边界上的点不算,所以我们要求边长为R-1的矩形.

code

送上AC代码

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<math.h>
 4 using namespace std;
 5 int map[5005][5005]={0};
 6 int main()
 7 {
 8     int N,R;
 9     int x,y,w;
10     cin>>N>>R;
11     int n = R,m = R;
12     for(int i=0;i<N;i++)
13     {
14         cin>>x>>y>>w;
15         x++; y++;
16         map[x][y]+=w;
17         n = max(n,x);
18         m = max(m,y);
19     }
20     for(int i=1;i<=n;i++)
21     {
22         for(int j=1;j<=m;j++)
23         {
24             map[i][j] +=map[i-1][j]+map[i][j-1]-map[i-1][j-1];
25         }
26     }
27     int ans = 0;
28     for(int i=R;i<=n;i++)
29     {
30         for(int j=R;j<=m;j++)
31         {
32             int tmp = map[i][j]-map[i-R][j]-map[i][j-R]+map[i-R][j-R];
33             ans = max(ans,tmp);
34         }
35     }
36     cout<<ans<<endl;
37  }
原文地址:https://www.cnblogs.com/zi-nai-boboyang/p/11437109.html