80pt求调
查看原帖
80pt求调
287217
tanyanling楼主2023/2/15 09:15

记录

#include<bits/stdc++.h>
using namespace std;
const long long mod=998244353;
int T,id;
int line[1001][1001],que[1001][1001];
char a[1001][1001];
long long sigma[1001],sigmaq[1001];
int main()
{
	scanf("%d%d",&T,&id);
	while(T--)
	{
		int n,m;
		long long c,f;
		scanf("%d%d%lld%lld",&n,&m,&c,&f);
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
			{
				char c=getchar();
				while(c!='0'&&c!='1')
					c=getchar();
				a[i][j]=c;
			}
		for(int i=1;i<=1000;i++)
			for(int j=1;j<=1000;j++)
			{
				line[i][j]=0;
				que[i][j]=0;
			}
		for(int i=n;i>=1;i--)
		{
			for(int j=m;j>=1;j--)
			{
				if(a[i][j]=='0')
				{
					line[i][j]=line[i][j+1]+1;
					que[i][j]=que[i+1][j]+1;
				}
			}
		}
		long long vc=0,vf=0;
		for(int i=1;i<=m;i++)
		{
			for(int j=1;j<=n;j++)
			{
				sigma[j]=sigma[j-1]+max((long long)0,(long long)line[j][i]-1);
				sigma[j]%=mod;
			}
			for(int j=1;j<=n;j++)
			{
				sigmaq[j]=sigmaq[j-1]+max((long long)0,(long long)(line[j][i]-1)*(que[j][i]-1));
				sigmaq[j]%=mod;
			}
			for(int j=1;j<=n;j++)
			{
				if(line[j][i]>=2&&que[j][i]>=3)
				{
					vc+=(long long)(line[j][i]-1)*(sigma[j+que[j][i]-1]-sigma[j+1]);
					vc%=mod;
					if(que[j][i]>=4)
					{
						vf+=(long long)(line[j][i]-1)*(sigmaq[j+que[j][i]-1]-sigmaq[j+1]);
						vf%=mod;
					}
				}
			}
		}
		vc*=c,vf*=f;
		vc%=mod,vf%=mod;
		printf("%lld %lld\n",vc,vf);
	}
	return 0;
} 
2023/2/15 09:15
加载中...