所以这道题是前缀和吗
查看原帖
所以这道题是前缀和吗
476921
_zhy楼主2022/11/27 16:24

rt。

code

#include <cstdio>
#define LL long long

const int N = 1e3 + 5;
const LL Mod = 998244353;

LL T, id, n, m, c, f, a[N][N], b[N][N], p[N][N], pp[N][N], ans1, ans2;
char map[N][N];

int main() {
	scanf("%lld %lld", &T, &id);
	while (T--) {
		scanf("%lld %lld %lld %lld", &n, &m, &c, &f);
		for (int i = 1; i <= n; i++) {
			scanf("\n");
			for (int j = 1; j <= m; j++)
				map[i][j] = getchar();
		}
		m++;
		for (int i = 1; i <= n; i++)
			map[i][m] = '1';
		n++;
		for (int i = 1; i <= m; i++)
			map[n][i] = '1';
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m; j++)
				a[i][j] = b[i][j] = p[i][j] = pp[i][j] = 0;
		for (int i = n; i; i--)
			for (int j = m; j; j--)
				if (map[i][j] == '1')
					a[i][j] = i, b[i][j] = j;
				else
					a[i][j] = a[i + 1][j], b[i][j] = b[i][j + 1];
		m--, n--;
		for (int i = 1; i <= m; i++)
			for (int j = n; j; j--)
				p[j][i] = ((b[j][i] - i - 1) * (map[j][i] == '0') + p[j + 1][i]) % Mod, pp[j][i] = ((b[j][i] - i - 1) * (n - j) * (map[j][i] == '0') % Mod + pp[j + 1][i]) % Mod;
		ans1 = ans2 = 0;
		for (int i = 1; i <= n; i++) 
			for (int j = 1; j <= m; j++) {
				if (a[i][j] > i + 2 && b[i][j] > j + 1)
					(ans1 += ((b[i][j] - j - 1 + Mod) % Mod) * ((p[i + 2][j] - p[a[i][j]][j] + Mod) % Mod) % Mod) %= Mod;
				if (a[i][j] > i + 3 && b[i][j] > j + 1)
					(ans2 += ((b[i][j] - j - 1 + Mod) % Mod) * (((pp[i + 2][j] - pp[a[i][j]][j] + Mod) % Mod - ((p[i + 2][j] - p[a[i][j]][j] + Mod) % Mod) * (n + 1 - a[i][j]) % Mod + Mod) % Mod) % Mod) %= Mod;
			}
		printf("%lld %lld\n", ans1 * c, ans2 * f);
	}
	return 0;
}
2022/11/27 16:24
加载中...