求助
  • 板块灌水区
  • 楼主hwc2011
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/23 22:13
  • 上次更新2024/11/24 09:31:27
查看原帖
求助
1313003
hwc2011楼主2024/11/23 22:13

蒟蒻改编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);
}
2024/11/23 22:13
加载中...