30pts 全RE smg
查看原帖
30pts 全RE smg
120324
Yansuan_HCl楼主2021/3/28 07:45

求调试/kk

#include <bits/stdc++.h>
using namespace std;
#define ms(x,v) memset(x, v, sizeof(x))

typedef long long ll;

ll n, a[1005][1005];
ll ld[2010], rd[2010];

ll solve(ll i) {
	if (i == 1) return ld[n];
	if (i == n) return rd[n];
	return ld[n - i + 1] + rd[n - i + n] + ld[n + i - 1] + rd[i] - a[1][i] - a[n - i + 1][n] - a[n][n - i + 1] - a[i][1];
}

int main() {
	freopen("pacman.in", "r", stdin);
	freopen("pacman.out", "w", stdout);
	scanf("%lld", &n);
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= n; ++j)
			scanf("%lld", &(a[i][j]));
	// 右上角第一个开始点为1...直到左上角为n...直到左下角为2n-1 此为ld
	// 左上角第一个开始点为1...直到右上角为n...直到右下角为2n-1 此为rd
	for (int i = 1; i < n * 2; ++i) {
		int r = 1, c = n - i + 1; // row column
		if (i > n) { c = 1; r = i - n + 1; }
		for (; r <= n && c <= n; ++r, ++c)
			ld[i] += a[r][c];
	}
	for (int i = 1; i < n * 2; ++i) {
		int r = 1, c = i;
		if (i > n) { c = n; r = i - n + 1; }
		for (; r <= n && c >= 1; ++r, --c)
			rd[i] += a[r][c];
	}
	
	ll faa = -1;
	for (int i = 1; i <= n; ++i) {
		for (int j = i; j <= n; ++j) {
			ll ans = 0;
			
			if (i == j) {
				ans = solve(i); // 重复, 取一次
			} else if (i == 1 && j == n) {
				ans = solve(i) + solve(j);
				// 如果点的个数是奇数则在中间点相交, 偶数则不相交
				if (n & 1) {
					ans -= a[(n + 1) / 2][(n + 1) / 2];
				}
			} else if (i == 1) {
				ans = solve(i) + solve(j);
				if (j & 1) {
					ans -= a[(j + 1) / 2][(j + 1) / 2];
					ans -= a[n - (j + 1) / 2 + 1][n - (j + 1) / 2 + 1];
				}
			} else {
				ll ar = 1, ac = i, br = i, bc = 1,
					cr = n, cc = n - i + 1, dr = n - i + 1, dc = n,
					er = 1, ec = j, fr = j, fc = 1,
					gr = n, gc = n - j + 1, hr = n - j + 1, hc = n;
				ans = solve(i) + solve(j);
				ll dif = abs(ec - ac);
				if (!(dif & 1)) ans -= a[ar + dif / 2][ac + dif / 2]; // 为偶则有交点
				dif = abs(hr - br);
				if (!(dif & 1)) ans -= a[br + dif / 2][bc + dif / 2];
				dif = abs(gc - cc);
				if (!(dif & 1)) ans -= a[cr - dif / 2][cc - dif / 2];
				dif = abs(fr - dr);
				if (!(dif & 1)) ans -= a[dr - dif / 2][dc - dif / 2];
			}
			faa = max(faa, ans);
		}
	}
	printf("%lld", faa);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}
2021/3/28 07:45
加载中...