测试样例全过,但是检查点只对了Subtask #1第一个(我猜这个是测试用例),代码有点乱,调试注释了 看了F题解思路自己写的C
#include<bits/stdc++.h>
using namespace std;
int n,m,c,f,T,id;
char a[1005][1005];
int h[1005][1005],s[1005][1005],s2[1005][1005],s3[1005][1005];
int main(){
cin>>T>>id;
for(int time__1239=0;time__1239<T;time__1239++){
cin>>n>>m>>c>>f;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=0;i<=n+1;i++){
for(int j=m+1;j>=0;j--){
h[i][j]=-1;
s2[i][j]=-1;
}
}
for(int i=1;i<=n;i++){
for(int j=m;j>=1;j--){
if(a[i][j]=='1')h[i][j]=-1;
else h[i][j]=1+h[i][j+1];
}
}
for(int i=n;i>=1;i--){
for(int j=1;j<=m;j++){
if(h[i][j]==-1)s[i][j]=0;
else s[i][j]=h[i][j]+s[i+1][j];
}
}
for(int i=n;i>=1;i--){
for(int j=1;j<=m;j++){
if(a[i][j]=='1')s2[i][j]=-1;
else s2[i][j]=1+s2[i+1][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(h[i][j]==-1)s3[i][j]=0;
else s3[i][j]=h[i][j]+s3[i-1][j];
}
}
long long sum=0;
/*
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<a[i][j];
}cout<<endl;
}
cout<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<h[i][j];
}cout<<endl;
}cout<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<s[i][j];
}cout<<endl;
}cout<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<s2[i][j];
}cout<<endl;
}cout<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<s3[i][j];
}cout<<endl;
}cout<<endl;
*/
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(h[i][j]<1 || s[i+2][j]<1||a[i+1][j]=='1'){//cout<<" "<<0;
continue;}
sum+=h[i][j]*s[i+2][j];
sum%=998244353;
//cout<<setw(3)<<setfill(' ')<<h[i][j]*s[i+2][j];
}//cout<<endl;
}
cout<<sum*c<<' '/*<<endl*/;
sum=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(s2[i][j]<1 || s3[i-2][j]<1 || h[i][j]<1||a[i-1][j]=='1'){//cout<<" "<<0;
continue;}
sum+=h[i][j]*s3[i-2][j]*s2[i][j];
sum%=998244353;
//cout<<setw(3)<<setfill(' ')<< h[i][j]*s3[i-2][j]*s2[i][j];
}//cout<<endl;
}
cout<<sum*f;
}
}