80分求助
查看原帖
80分求助
1276703
Herobrine10楼主2024/6/11 17:27
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int M=998244353;
int a[1005][1005];
int cnt[1005][1005];
int nx[1005][1005];
int mx[1005][1005];
signed main(){
	int T,x;
	scanf("%d%d",&T,&x);
	while(T--){
		memset(cnt,0,sizeof(cnt));
		memset(nx,0,sizeof(nx));
		memset(mx,0,sizeof(mx));
		int n,m,c,f;
		int ansc=0,ansf=0;
		scanf("%d%d%d%d",&n,&m,&c,&f);	
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				char c;
				cin>>c;
				a[i][j]=c-'0';
			}
		}
		if(c==0&&f==0){
			printf("0 0\n");
			continue;
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				cnt[i][j]=cnt[i-1][j]+a[i][j];
			}
		}
		for(int i=1;i<=n;i++){
			for(int j=m;j>=1;j--){
				if(!a[i][j]){
					mx[i][j]=max(j,mx[i][j+1]);
				}
			}
		}
		for(int j=1;j<=m;j++){
			for(int i=n;i>=1;i--){
				if(!a[i][j]){
					nx[i][j]=max(i,nx[i+1][j]);
				}
			}
		}
		for(int k=1;k<=m;k++){
			for(int i=1;i<=n;i++){
				if(a[i][k])continue;
				for(int j=i+2;j<=n;j++){
					if(a[j][k]) break;
					int cnt1=0,cnt2=0,cnt3=0;
					if(cnt[j][k]-cnt[i][k]==0){
						cnt1=mx[i][k]-k;
						cnt2=mx[j][k]-k;
					}
					cnt3=nx[j][k]-j;
					int y=cnt1*cnt2;
					y%=M;
					ansc=(ansc+y)%M;
					ansf=(ansf+y*cnt3)%M;
				}
			}
		}
		printf("%lld ",ansc%M);
		if(f==0) printf("0\n");
		else printf("%lld\n",ansf%M);
	}
	return 0;
}
2024/6/11 17:27
加载中...