退役前最后一求(不知什么问题,大概和多测无关,100->10)
查看原帖
退役前最后一求(不知什么问题,大概和多测无关,100->10)
315005
White_gugu楼主2022/12/5 20:33

打击挺大的,但还是想知道为什么,拜托大家了

#include<cstring>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int T,id,n,m,s1[1010][1010],s3[1010][1010];
long long s2[1010][1010];
char a[1010][1010];
long long c,f;
const long long mod=998244353;
int main(){
	freopen("plant.in","r",stdin);
	freopen("plant.out","w",stdout);
	scanf("%d %d",&T,&id);
	while(T--){
		scanf("%d %d %lld %lld",&n,&m,&c,&f);
		for(int i=1;i<=n;i++)
		 for(int j=1;j<=m;j++){
		 	a[i][j]=getchar();
		 	while(a[i][j]!='0'&&a[i][j]!='1') 
			 a[i][j]=getchar();
		 }
		for(int i=1;i<=n;i++)
		 for(int j=m;j>=1;j--)
		 if(a[i][j]=='1') s1[i][j]=0;
		 else s1[i][j]=s1[i][j+1]+1;
		for(int j=1;j<=m;j++)
		 for(int i=n;i>=1;i--)
		 if(a[i][j]=='1') s3[i][j]=0;
		 else s3[i][j]=s3[i+1][j]+1;
		for(int j=1;j<=m;j++) 
		 for(int i=n;i>=1;i--)
		 if(a[i][j]=='1') s2[i][j]=0;
		 else s2[i][j]=s2[i+1][j]+s1[i][j]-1;
		long long ans=0;
		for(int i=1;i<=n-2;i++)
		 for(int j=1;j<=m;j++){
		 	if(a[i][j]=='1'||a[i+1][j]=='1'||a[i+2][j]=='1') continue;
		 	ans=(ans+(long long)(s2[i][j]-(s1[i][j]-1)-(s1[i+1][j]-1))*(long long)(s1[i][j]-1)%mod)%mod;
		 }
		printf("%lld ",ans*c);
		ans=0;
		for(int j=1;j<=m;j++)
		 for(int i=n;i>=1;i--)
		 if(a[i][j]=='1') s2[i][j]=0;
		 else s2[i][j]=s2[i+1][j]+(long long)(s1[i][j]-1)*(long long)(s3[i][j]-1);
		for(int i=1;i<=n-3;i++)
		 for(int j=1;j<=m;j++){
		 	if(a[i][j]=='1'||a[i+1][j]=='1'||a[i+2][j]=='1'||a[i+3][j]=='1') continue;
		 	ans=(ans+(long long)(s2[i][j]-(s1[i][j]-1)*(s3[i][j]-1)-(s1[i+1][j]-1)*(s3[i+1][j]-1)+mod)%mod*(long long)(s1[i][j]-1)%mod)%mod;
		 }
		 printf("%lld\n",ans*f);
	}
	return 0;
}
2022/12/5 20:33
加载中...