记录编号 607089 评测结果 AAAAA
题目名称 3971.不重叠正方形 最终得分 100
用户昵称 Gravatar对立猫猫对立 是否通过 通过
代码语言 C++ 运行时间 0.683 s
提交时间 2025-10-05 15:44:07 内存使用 31.08 MiB
显示代码纯文本
#include <bits/stdc++.h>
#define maxn 1005
using namespace std;
using ll = long long;
int n, m, a[maxn][maxn];
ll pre[maxn][maxn], sum[maxn][maxn];
ll tl[maxn][maxn], tr[maxn][maxn], bl[maxn][maxn], br[maxn][maxn];
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) cin >> a[i][j];
	for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) pre[i][j] = pre[i - 1][j] + pre[i][j - 1] + a[i][j] - pre[i - 1][j - 1];
	for (int i = m; i <= n; i++) for (int j = m; j <= n; j++) sum[i][j] = pre[i][j] - pre[i - m][j] - pre[i][j - m] + pre[i - m][j - m];
	for (int i = m; i <= n; i++) for (int j = m; j <= n; j++) tl[i][j] = max({tl[i][j - 1], tl[i - 1][j], sum[i][j]});
	for (int i = m; i <= n; i++) for (int j = n - m + 1; j >= 1; j--) tr[i][j] = max({tr[i][j + 1], tr[i - 1][j], sum[i][j + m - 1]});
	for (int i = n - m + 1; i >= 1; i--) for (int j = m; j <= n; j++) bl[i][j] = max({bl[i + 1][j], bl[i][j - 1], sum[i + m - 1][j]});
	for (int i = n - m + 1; i >= 1; i--) for (int j = n - m + 1; j >= 1; j--) br[i][j] = max({br[i + 1][j], br[i][j + 1], sum[i + m - 1][j + m - 1]});
	ll ans = 0;
	for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) {
			if (i - m >= m && i + m <= n && j >= m)
				ans = max(ans, sum[i][j] + tr[i - m][1] + br[i + 1][1]);
			if (i >= m && j - m >= m && j + m - 1 <= n)
				ans = max(ans, sum[i][j] + bl[1][j - m] + br[1][j + 1]);
			if (i - 1 >= m  &&  i + m - 1 <= n  &&  j - 1 >= m && j + m - 1 <= n) {
				ans = max(ans, br[i][j] + bl[i][j - 1] + tr[i - 1][1]);
				ans = max(ans, br[i][1] + tl[i - 1][j - 1] + tr[i - 1][j]);
				ans = max(ans, br[1][j] + tl[i - 1][j - 1] + bl[i][j - 1]);
				ans = max(ans, br[i][j] + bl[1][j - 1] + tr[i - 1][j]);
			}
		}
	cout << ans << '\n';
	return 0;
}