蒟蒻改编NOIP2022T1创了道题,但是不知代码正确性,恳求各位大佬指点指点。
蒟蒻的屎山代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,sum1[1005][1005],sum2[1005][1005],sum3[1005][1005],sum4[1005][1005],ans1[1005][1005],ans2[1005][1005],ans3[1005][1005],ans4[1005][1005],a[1005][1005],mod=1e9+7;
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%lld",&a[i][j]);
if(a[i][j]==0) sum1[i][j]=sum1[i][j-1]+1;
}
for(int j=m;j>=1;j--) if(a[i][j]==0) sum2[i][j]=sum2[i][j+1]+1;
}
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++) if(a[i][j]==0) sum3[i][j]=sum3[i-1][j]+1;
for(int i=n;i>=1;i--) if(a[i][j]==0) sum4[i][j]=sum4[i+1][j]+1;
}
for(int j=1;j<=m;j++){
int lst=0;
for(int i=1;i<=n;i++){
if(a[i][j]==1){
lst=0;
continue;
}
if(i>2&&a[i-2][j]==0&&a[i-1][j]==0) lst=(lst+sum1[i-2][j]-1)%mod;
ans1[i][j]=lst;
}
}
for(int j=1;j<=m;j++){
int lst=0;
for(int i=n;i>=1;i--){
if(a[i][j]==1){
lst=0;
continue;
}
if(i+2<=n&&a[i+2][j]==0&&a[i+1][j]==0) lst=(lst+sum2[i+2][j]-1)%mod;
ans2[i][j]=lst;
}
}
for(int i=1;i<=n;i++){
int lst=0;
for(int j=m;j>=1;j--){
if(a[i][j]==1){
lst=0;
continue;
}
if(j+2<=m&&a[i][j+2]==0&&a[i][j+1]==0) lst=(lst+sum3[i][j+2]-1)%mod;
ans3[i][j]=lst;
}
}
for(int i=1;i<=n;i++){
int lst=0;
for(int j=1;j<=m;j++){
if(a[i][j]==1){
lst=0;
continue;
}
if(j>2&&a[i][j-2]==0&&a[i][j-1]==0) lst=(lst+sum4[i][j-2]-1)%mod;
ans4[i][j]=lst;
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans=ans+(ans1[i][j]*ans2[i][j]%mod*ans3[i][j]%mod*ans4[i][j]%mod)%mod;
}
}
printf("%lld",ans);
}