#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int map[130][130],d, n,; long long sum[130][130], ans, cnt; void init() { //前缀和预处理 int a, b, c; for(int i = 1; i <= n; ++i) { scanf("%d%d%d", &a, &b, &c); map[a][b] = c;//存储x,y路口的公共场所数 } //预处理二维前缀和 ,区间覆盖的公共场所数 for(int i = 0; i <= 128; ++i) { for(int j = 0; j <= 128; ++j) { sum[i][j] = (sum[i][j-1] + sum[i-1][j] - sum[i-1][j-1] + map[i][j]); } } } //求区间x1y1到x2y2的和 int getmany(int x1, int y1, int x2, int y2) { //前缀和查询 return sum[x2][y2] - sum[x1-1][y2] - sum[x2][y1-1] + sum[x1-1][y1-1]; } void cross(int x, int y) { //查询(x,y)为中心的正方形权值并更新结果 int x1, x2, y1, y2; //边界判断 x1 = (x - d >= 0) ? (x - d) : 0; y1 = (y - d >= 0) ? (y - d) : 0; x2 = (x + d <= 128) ? (x + d) : 128; y2 = (y + d <= 128) ? (y + d) : 128; int tmp = getmany(x1, y1, x2, y2);//求区间和 if(tmp == ans) ++cnt; //更新方案数 if(tmp > ans) cnt = 1, ans = tmp;//更新最大 } int query() { //枚举(x,y)为中心的正方形 for(int i = 0; i <= 128; ++i) { for(int j = 0; j <= 128; ++j) { cross(i, j);//每个点进行尝试 } } return ans; } int main() { scanf("%d%d", &d, &n); init(); query(); printf("%lld %lld\n",cnt , ans); return 0; }
当前位置:首页 > NOIP真题代码注释 > 正文
有话要说...