求调 TLE 两个
查看原帖
求调 TLE 两个
616449
China_yinyang楼主2024/11/13 22:38
#include<bits/stdc++.h>
const int MOD=998244353,N=1e3+10;
using namespace std;
char o;
long long n,m,c,f;
int mp[N][N],maxn[N][N],maxm[N][N],cnt[N][N],ansc,ansf;
int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
	int T,id;
	cin>>T>>id;
	while(T--)
	{
		memset(cnt,0,sizeof(cnt));
		memset(maxn,0,sizeof(maxn));
		memset(maxm,0,sizeof(maxm));
		ansc=ansf=0;
		cin>>n>>m>>c>>f;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				cin>>o;
				mp[i][j]=o-'0';
			}
		}
		if(c==0&&f==0)
		{
			cout<<"0 0\n";
			continue ;
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				cnt[i][j]=cnt[i-1][j]+mp[i][j];
			}
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=m;j>=1;j--)
			{
				if(!mp[i][j])
				{
					maxm[i][j]=max(j,maxm[i][j+1]);
				}
			}
		}
		for(int j=1;j<=m;j++)
		{
			for(int i=n;i>=1;i--)
			{
				if(!mp[i][j])
				{
					maxn[i][j]=max(i,maxn[i+1][j]);
				}
			}
		}
		
		for(int k=1;k<=m/10;k++)
		{
			for(int i=1;i<=n;i++)
			{
				if(mp[i][k]) continue;
				for(int j=i+2;j<=n;j++)
				{
					if(mp[j][k]) break;
					int cnt1=0,cnt2=0,cnt3=0;
					if(cnt[j][k]-cnt[i][k]==0)
					{
						cnt1=maxm[i][k]-k;
						cnt2=maxm[j][k]-k;
					}
					cnt3=maxn[j][k]-j;
					int p=cnt1*cnt2;
					p%=MOD;
					ansc=(ansc+p)%MOD;
					ansf=(ansf+p*cnt3)%MOD;
				}
			}
		}
		cout<<ansc%MOD<<" ";
		if(f==0)
		cout<<"0\n";
		else 
		cout<<ansf%MOD<<"\n";
	}
	return 0;
}
2024/11/13 22:38
加载中...