如这个6分的代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1010;
const ll mod=998244353;
int t,id,c,f,n,m,sum[MAXN][MAXN];
char mp[MAXN][MAXN];
ll mx1[MAXN][MAXN],mx2[MAXN][MAXN],sum1[MAXN][MAXN],sum2[MAXN][MAXN],ansc,ansf;
int getsum(int i,int j,int l,int r){
return sum[i][j]-sum[i][r-1]-sum[l-1][j]+sum[l-1][r-1];
}
int main(){
freopen("plant.in","r",stdin);
freopen("plant.out","w",stdout);
scanf("%d%d",&t,&id);
while(t--){
memset(mx1,0,sizeof(mx1));
memset(mx2,0,sizeof(mx2));
ansc=ansf=0;
scanf("%d%d%d%d",&n,&m,&c,&f);
for(int i=1;i<=n;i++)
scanf("%s",mp[i]+1);
if(id==1){
printf("0 0\n");
continue ;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+mp[i][j]-'0';
for(int i=1;i<=n;i++)
for(int j=m;j>0;j--)
if(mp[i][j]=='1')
mx1[i][j]=0;
else
mx1[i][j]=mx1[i][j+1]+1;
for(int j=1;j<=m;j++)
for(int i=n;i>=1;i--)
if(mp[i][j]=='1')
mx2[i][j]=0;
else
mx2[i][j]=mx2[i+1][j]+1;
for(int j=1;j<=m;j++)
for(int i=n;i>=1;i--)
if(mp[i][j]=='1')
sum1[i][j]=sum2[i][j]=0;
else{
sum1[i][j]=(sum1[i+1][j]+mx1[i][j]-1)%mod;
sum2[i][j]=(sum2[i+1][j]+(mx1[i][j]-1)*(mx2[i][j]-1)%mod)%mod;
}
for(int i=1;i<=n-2;i++)
for(int j=1;j<=m-1;j++)
if(mp[i][j]=='0' && mp[i+1][j]=='0' && mp[i+2][j]=='0')
{
ansc+=(mx1[i][j]-1)*sum1[i+2][j]%mod,ansc%=mod;
ansf+=(mx1[i][j]-1)*sum2[i+2][j]%mod,ansf%=mod;
}
// for(int k=i+2;k<=n;k++)
// if(mp[i][j]=='0' && mp[k][j]=='0' && getsum(k,j,i,j)==0)
// {
//// printf("%d %d %d %lld\n",i,j,k,ansc);
// ansc=(ansc+(mx1[i][j]-1)*(mx1[k][j]-1))%mod;
// ansf=(ansf+(mx1[i][j]-1)*(mx1[k][j]-1)%mod*(mx2[k][j]-1))%mod;
// }
printf("%lld %lld\n",ansc*c,ansf*f);
}
return 0;
}
原地AFO