MnZn99pts RE求调
查看原帖
MnZn99pts RE求调
510311
Yuzzzu楼主2024/10/16 11:13
#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,id,n,m,c,f,a[1050][1050],ansc,ansf,f1[1050][1050],s1[1050][1050],h[1050][1050],h1[10510][1050];
const int mod=998244353;
string s;
signed main(){
	//freopen("1.in","r",stdin);
	//freopen("1.out","w",stdout);
	scanf("%lld%lld",&T,&id);
	while(T--){
		memset(a,1,sizeof(a));
		memset(s1,0,sizeof(s1));
		memset(h,0,sizeof(h));
		memset(h1,0,sizeof(h1));
		memset(f1,0,sizeof(f1));
		ansc=ansf=0;
		scanf("%lld%lld%lld%lld",&n,&m,&c,&f);
		if(c==0 && f==0){
			printf("0 0\n");
			continue;
		}
		for(int i=1;i<=n;i++){
			cin>> s;
			for(int j=1;j<=s.length();j++)	a[i][j]=s[j-1]-'0';
		}
		for(int i=1;i<=n;i++){
			for(int j=m;j>=1;j--){
				if(a[i][j]) continue;
				h1[i][j]=(h1[i][j]%mod+((h1[i][j+1])%mod)+1)%mod;
			}
		}
		for(int j=1;j<=m;j++){
			for(int i=n;i>=1;i--){
				if(a[i][j]) continue;
				s1[i][j]=(s1[i][j]%mod+s1[i+1][j]%mod+1)%mod;
			}
		}
		for(int j=1;j<=m;j++){
			for(int i=n;i>=1;i--){
				if(a[i][j]) continue;
				h[i][j]=(h[i][j]%mod+(h[i+1][j]%mod+h1[i][j]%mod-1)%mod)%mod;
				f1[i][j]=(f1[i+1][j]%mod+((h1[i][j]-1)%mod)*((s1[i][j]-1)%mod)%mod)%mod;
			}
		}
		for(int j=1;j<=m;j++){
			for(int i=1;i<=n;i++){
				if(h1[i][j]>1 && !a[i+1][j] &&!a[i][j] && h[i+2][j]){
					ansc=(ansc%mod+((h1[i][j]-1)%mod)*(h[i+2][j]%mod)%mod)%mod;
					if(f1[i][j]) ansf=(ansf%mod+((h1[i][j]-1)%mod)*(f1[i+2][j]%mod)%mod)%mod;
					//cout<<i<<' '<<j<< ' '<< ansc<<' '<< ansf<<'\n'; 
				}
			}
		}
		printf("%lld %lld\n",(ansc*c)%mod,(ansf*f)%mod);
	}
	return 0;
}

应该没越界?

2024/10/16 11:13
加载中...