Luogu P2038 无线网络发射器选址___前缀和

题目大意:

Luogu P2038 无线网络发射器选址___前缀和_第1张图片
Luogu P2038 无线网络发射器选址___前缀和_第2张图片
Luogu P2038 无线网络发射器选址___前缀和_第3张图片
Luogu P2038 无线网络发射器选址___前缀和_第4张图片

题解:

这题就用前缀和随便弄弄就好了,因为有一些可能越界,所以p要开负数数组,c++要加个数挪一下。

代码:

#include
#define N 505
#define M 150

using namespace std;

int n,m,ans,cnt,sum[N][N];

int main()
{
    scanf("%d",&n);
    scanf("%d",&m);
    for (int i=1; i<=m; i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            sum[x+M][y+M]=z;
        }
    cnt=ans=0;
    for (int i=M; i<=M+128+n; i++)
         for (int j=M; j<=M+128+n; j++) 
         sum[i][j]+=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1];

    for (int i=M; i<=M+128; i++)
         for (int j=M; j<=M+128; j++)
         {
              int rp=sum[i+n][j+n]-sum[i+n][j-n-1]-sum[i-n-1][j+n]+sum[i-n-1][j-n-1];
              if (rp>ans){
                  ans=rp;
                  cnt=1;
              } else if (rp==ans) cnt++; 
         }
    printf("%d %d\n",cnt,ans);     
    return 0;
}

你可能感兴趣的:(C++,前缀和)