过样例 12pts求调
查看原帖
过样例 12pts求调
651793
Rosent楼主2023/11/17 23:14

rt,大样例能过但是似乎 f 求的是错的

#include <bits/stdc++.h>
#define mod 998244353
#define int long long
#define maxn 2010
using namespace std;
int a[maxn][maxn],sum[maxn][maxn],suml[maxn][maxn],sumc[maxn][maxn],sumy[maxn][maxn],sumf[maxn][maxn],sumfa[maxn][maxn];
signed main()
{
	int tt,id;
//	freopen("plant2.in","r",stdin);
	cin>>tt>>id;
	while(tt--)
	{
		int n,m,c,f,ansc=0,ansf=0;
		cin>>n>>m>>c>>f;
		char t;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				cin>>t;
				if(t=='1') a[i][j]=0;
				else a[i][j]=1;
			}
			
		}
		for(int i=1;i<=n;i++)
			for(int j=m;j>=1;j--)
				if(a[i][j]==0)
					sum[i][j]=0;
				else
					sum[i][j]=sum[i][j+1]+a[i][j];
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				if(sum[i][j]!=0)
					sum[i][j]--;
		for(int i=n;i>=1;i--)
			for(int j=1;j<=m;j++)
				if(a[i][j]==0)
					suml[i][j]=0;
				else
					suml[i][j]=suml[i+1][j]+sum[i][j];
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				if(a[i+1][j]==1)
					sumc[i][j]=sum[i][j]*suml[i+2][j]%mod;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				ansc=(ansc+sumc[i][j])%mod;
		for(int i=n;i>=1;i--)
			for(int j=1;j<=m;j++)
				if(a[i][j]==0)
					sumy[i][j]=0;
				else
					sumy[i][j]=(sumy[i+1][j]+a[i][j])%mod;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				if(sumy[i][j]>=2)
					sumf[i][j]=sum[i][j]*(sumy[i][j]-1)%mod;
				else
					sumf[i][j]=0;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				if(a[i][j]==0)
					sumfa[i][j]=0;
				else
					sumfa[i][j]=(sumfa[i+1][j]+sumf[i][j])%mod;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				if(a[i+1][j]==1)
					ansf=(ansf+sum[i][j]*sumfa[i+2][j]%mod)%mod;
		cout<<ansc*c%mod<<" "<<ansf*f%mod<<endl;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				sum[i][j]=sumc[i][j]=sumf[i][j]=sumfa[i][j]=suml[i][j]=sumy[i][j]=a[i][j]=0;
		ansc=ansf=0;
	}
	return 0;
}
2023/11/17 23:14
加载中...