题面
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 }