题目P8865 [NOIP2022] 种花
#include<bits/stdc++.h>
using namespace std;
const int MS=1e3+3,p=998244353;
int T,id,n,m,c,f,a[MS][MS],sumx[MS][MS],sumy[MS][MS];
long long sumc,sumf;
char s[MS][MS];
int main(){
scanf("%d%d",&T,&id);
while(T--){
sumc=0; sumf=0;
memset(sumx,0,sizeof(sumx));
memset(sumy,0,sizeof(sumy));
scanf("%d%d%d%d",&n,&m,&c,&f);
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(s[i][j]=='0')a[i][j]=0;
else a[i][j]=1;
for(int i=1;i<=n;i++){
int cnt=0;
for(int j=m;j>=1;j--){
if(a[i][j]==0)sumx[i][j]=cnt++;
else sumx[i][j]=cnt=0;
}
}//表示(i,j)右方有几个空地
for(int j=1;j<=m;j++){
int cnt=0;
for(int i=n;i>=1;i--){
if(a[i][j]==0)sumy[i][j]=cnt++;
else sumy[i][j]=cnt=0;
}
}//表示(i,j)下方有几个空地
for(int j=1;j<=m;j++){
long long cnt=0;
for(int i=3;i<=n;i++){
if(a[i][j]==1||a[i-1][j]==1||a[i-2][j]==1){
cnt=0;
continue;
}
cnt+=sumx[i-2][j];//若(i-2,j)为土坑 sumx[i-2][j]=0无影响
sumc=(sumc+cnt*sumx[i][j])%p;
sumf=(sumf+cnt*sumx[i][j]*sumy[i][j])%p;
}
}
printf("%lld %lld\n",sumc%p,sumf%p);
}
return 0;
}
noip要废了 这么简单的题还调了好久QWQ