您的位置:首页 > 理论基础 > 计算机网络

#NOIP 2014#day.2 T1 无限网络发射器选址

2016-07-26 11:29 302 查看
为了方便处理我们把x++,y++预留出一个空白行和空白列

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int d,n;
#define maxn 140
int a[maxn][maxn];
int sum[maxn][maxn];
int ans  = 0, tot = 0;
int main()
{
#define LOC
#ifdef LOC
freopen("wireless.in","r",stdin);
freopen("wireless.out","w",stdout);
#endif
scanf("%d",&d);
scanf("%d",&n);
int x,y;
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
x++,y++;
if(x>129||y>129)continue;
scanf("%d",&a[x][y]);
}
sum[1][1]=a[1][1];
for(int i=2;i<=129;i++)sum[1][i]=sum[1][i-1]+a[1][i];
for(int j=2;j<=129;j++)sum[j][1]=sum[j-1][1]+a[j][1];
for(int i=2;i<=129;i++)
{
for(int j=2;j<=129;j++)
{
sum[i][j]=sum[i][j-1]+sum[i-1][j]+a[i][j]-sum[i-1][j-1];
}
}

for(int i=1;i<=129;i++)
{
for(int j=1;j<=129;j++)
{
int dx = max(0,i-d-1);
int kx = min(129,i+d);
int dy = max(j-d-1,0);
int ky = min(129,j+d);
int _tot = sum[kx][ky]-sum[dx][ky]-sum[kx][dy]+sum[dx][dy];
if(_tot==tot)ans++;
else if(_tot>tot)
{
ans = 1;
tot = _tot;
}
}
}

printf("%d %d",ans,tot);
return 0;
}
/*
对于 100%的数据, 1 ≤ d ≤ 20, 1 ≤ n ≤ 20, 0 ≤ x ≤ 128,
0 ≤ y ≤ 128, 0 < k ≤1,000,000。
输出一行,包含两个整数, 用一个空格隔开,分别表示能覆盖最多公共场所的安装地点
方案数,以及能覆盖的最多公共场所的数量。
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  前缀和