12pts求调
查看原帖
12pts求调
459188
zrt090604楼主2024/10/13 11:37

三个样例都对,不知道为什么一交就WA

#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5, M = 998244353;
typedef long long ll;
int t, id;
int n, m, c, f, a[N][N], row[N][N], col[N][N];
ll sumr[N][N];
void init() {
	memset(sumr, 0, sizeof sumr);
	memset(row, 0, sizeof row);
	memset(col, 0, sizeof col);
}
ll mc() {
	if(c == 0) return 0;
	ll ans = 0;
	for(int i = 1;i <= n;++i)
		for(int j = 1;j <= m;++j) {
			if(col[i][j]<3 || row[i][j]<2) continue;
			ans = (ans + (sumr[i+col[i][j]-1][j]-sumr[i+1][j]-col[i][j]+2)*(row[i][j]-1))%M;
		}
	return ans;
}
ll mf() {
	if(f == 0) return 0;
	ll ans = 0;
	for(int i = 1;i <= n;++i)
		for(int j = 1;j <= m;++j) {
			if(col[i][j]<4 || row[i][j]<2) continue;
			ans = (ans + (sumr[i+col[i][j]-2][j]-sumr[i+1][j]-col[i][j]+3)*(row[i][j]-1)*(col[i][j]-3))%M;
		}
	return ans;
}
void solve() {
	init();
	scanf("%d%d%d%d", &n, &m, &c, &f);
	for(int i = 1;i <= n;++i)
		for(int j = 1;j <= m;++j)
			scanf("%1d", &a[i][j]);
	int last = 0;
	for(int i = 1;i <= n;++i, last = 0) {
		for(int j = m;j >= 1;--j) {
			if(a[i][j]) last = 0;
			else row[i][j] = ++last;
		}
	}
	for(int j = 1;j <= m;++j)
		for(int i = 1;i <= n;++i)
			sumr[i][j] = sumr[i-1][j]+row[i][j];
	for(int j = 1;j <= m;++j, last = 0)
		for(int i = n;i >= 1;--i) {
			if(a[i][j]) last = 0;
			else col[i][j] = ++last;
		}
	printf("%lld %lld\n", mc(), mf());
}
int main () {
    scanf("%d%d", &t, &id);
    while(t--) solve();
    return 0;
}
2024/10/13 11:37
加载中...