求助Wa on#31#15&94pts
查看原帖
求助Wa on#31#15&94pts
1209720
CaiYuifei楼主2024/11/10 11:25

记录

#include<bits/stdc++.h>
using namespace std;
int n,m,c,f;
long long ans=0,sum,mol=998244353,yy[1050][1050];
char cc[1050][1050];
int x[1050][1050],y[1050][1050];
int main(){
	int t,id;
	cin>>t>>id;
	while(t--){
		cin>>n>>m>>c>>f;
		ans=0,sum=0;
		memset(x,0,sizeof(x));
		memset(y,0,sizeof(y));
		memset(yy,0,sizeof(yy));
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				cin>>cc[i][j];
				if(cc[i][j]=='1'){
					y[j][i]=0;
				} 
				else{
					y[j][i]=y[j][i-1]+1;//记每列每个位置(含这个位置)之前有多少0 
				}
			}
		}
		for(int i=n;i>=1;i--){
			for(int j=m;j>=1;j--){
				if(cc[i][j]=='1'){
					x[i][j]=0; 
					yy[j][i]=0;				
				} 
				else{
					x[i][j]=x[i][j+1]+1;//记每行每个位置之后(含这个位置)有多少0
					yy[j][i]=yy[j][i+1]+1;//记每列每个位置(含这个位置)之后有多少0 					
				}
			}
		}
		//ans记c,sum记f 
		for(int i=1;i<m;i++){
			long long e=0,jj;//jj记录上一行的0,e记在此行之前的所有有0的行的0数 
			for(int j=1;j<=n;j++){
				if(y[i][j]==0){
					e=0;
					jj=0;
					continue;
				}
				if(x[j][i+1]==0){
					jj=x[j][i+1];
					continue;
				}
				if(y[i][j]>=3){
					ans+=(x[j][i+1]*e)%mol;
					sum+=(((x[j][i+1]*e)%mol)*yy[i][j+1])%mol;
					//记在此行之前的所有有0的行与此行可构成的c和f 
					ans%=mol;
					sum%=mol;
					ans-=(jj*x[j][i+1])%mol;
					sum-=(((x[j][i+1]*jj)%mol)*yy[i][j+1])%mol;
					//去处在此行之前的所有有0的行与此行可构成不法的c和f 
					ans%=mol;
					sum%=mol;
				}			
				e+=x[j][i+1];
				e%=mol;
				jj=x[j][i+1];
			}
		}
		cout<<(ans*c)%mol<<' '<<(sum*c)%mol<<endl; 
	}
	return 0;
} 
2024/11/10 11:25
加载中...