31WA了!!!
查看原帖
31WA了!!!
529468
BlinkSwiftie楼主2023/10/29 20:31
//计算方案数 显然dp
//前缀和预处理 
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int M=998244353,N=1e3+5;
int t,id,n,m,c,f;
int a[N][N];
ll ri[N][N],down[N][N],up[N][N],ansc,ansf;
char ch;
int main()
{
	cin>>t>>id;
	while(t--)
	{
		ansc=ansf=0;
		memset(ri,0,sizeof(ri));
		memset(down,0,sizeof(down));
		memset(up,0,sizeof(up));
		memset(a,0,sizeof(a));
		cin>>n>>m>>c>>f;
		if(c==0&&f==0) 
		{
			printf("0 0\n");
			continue;
		}
		for(int i=1;i<=n;++i)
		{
			for(int j=1;j<=m;++j)
			{
				cin>>ch;
				if(ch=='1') a[i][j]=1;
			}
		}
		for(int i=1;i<=n;++i)
		{
			for(int j=m;j>=1;--j)
			{
				if(a[i][j]==1) ri[i][j]=0;
				else if(j==m) ri[i][j]=1;
				else ri[i][j]=ri[i][j+1]+1;
			}
		}	
		for(int i=1;i<=n;++i)
		{
			for(int j=1;j<=m;++j)
			{
				if(i<=2) up[i][j]=0;
				else if(a[i-2][j]==1||a[i-1][j]==1||a[i][j]==1) up[i][j]=0;
				else up[i][j]=up[i-1][j]+ri[i-2][j]-1;
			}
		}
		for(int i=n;i>=1;--i)
		{
			for(int j=1;j<=m;++j)
			{
				if(a[i][j]==1) down[i][j]=0;
				else if(i==n) down[i][j]=1;
				else down[i][j]=down[i+1][j]+1;
			}
		}
//		for(int i=1;i<=n;++i)
//		{
//			for(int j=1;j<=m;++j)
//			{
//				cout<<ri[i][j]<<' '<<up[i][j]<<' '<<down[i][j]<<endl;
//			}
//		}
		for(int i=3;i<=n;++i)
		{
			for(int j=1;j<m;++j)
			{
				if(ri[i][j]&&up[i][j])
				{
					ansc=(ansc+up[i][j]*(ri[i][j]-1))%M;
					if(down[i][j])ansf=(ansf+up[i][j]*(ri[i][j]-1)*(down[i][j]-1))%M;
				}
			}
		}
		printf("%d %d\n",ansc,ansf);
	}
	return 0;
}
2023/10/29 20:31
加载中...