NOIP模拟(10.31)T1 机器清洁工

机器清洁工

题目背景:

10.31 NOIP模拟T1

分析:矩阵前缀和,递推

 

比较显然的矩阵前缀和,先预处理,然后枚举每一个放置点,可以解决的范围是左上角(i - d, j - d)右下角(i + d, j + d)的矩形,直接O(1)计算。

Source:

/*
	created by scarlyw
*/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <cctype>
#include <vector>
#include <queue>
#include <set>
#include <ctime>

const int MAXN = 1500 + 10;
const int MAXX = 1025;

int d, n, x, y, z; 
int m[MAXN][MAXN];

inline void read_in() {
	scanf("%d%d", &d, &n);
	for (int i = 1; i <= n; ++i) 
		scanf("%d%d%d", &x, &y, &z), x++, y++, m[x][y] = z;
	for (int i = 1; i <= MAXX; ++i)
		for (int j = 1; j <= MAXX; ++j)
			m[i][j] = m[i - 1][j] + m[i][j - 1] - m[i - 1][j - 1] + m[i][j];
}

inline int calc(int x1, int y1, int x2, int y2) {
	return m[x2][y2] + m[x1 - 1][y1 - 1] - m[x1 - 1][y2] - m[x2][y1 - 1];
}

inline void solve() {
	int ans = -1, cnt = 0;
	for (int i = 1; i <= MAXX; ++i)
		for (int j = 1; j <= MAXX; ++j) {
			int x1 = std::max(i - d, 1), y1 = std::max(j - d, 1);
			int x2 = std::min(i + d, MAXX), y2 = std::min(j + d, MAXX);
			int temp = calc(x1, y1, x2, y2);
			(temp > ans) ? (ans = temp, cnt = 1) : (temp == ans ? cnt++ : 0);
		}
	std::cout << cnt << " " << ans;	
}

int main() {
//	freopen("cleaner.in", "r", stdin);
//	freopen("cleaner.out", "w", stdout);
	read_in();
	solve();
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值