救命,为什么infoj和洛谷测出来差70分啊
查看原帖
救命,为什么infoj和洛谷测出来差70分啊
670324
nafonsn楼主2022/11/28 19:04
#include<bits/stdc++.h>
using namespace std;
int T,id,n,m,c,f;
bool a[1005][1005];
char b[1005][1005];
long long csum1=0,csum2=0,csum=0,fsum=0,csumz=0,fx=0;
void youdfs1(int x,int y)
{
	int j=y;
	while(a[x][j]==1)
	{
		j++;
		if(j-y>=2) 
		{
			csum1++;
			csum1%=998244353;
		}
	}
} 
void youdfs2(int x,int y)
{
	int j=y;
	while(a[x][j]==1)
	{
		j++;
		if(j-y>=2)
		{
			csum2++;
			csum1%=998244353;
		}
	}
} 
void cdfs(int x,int y)
{
	int i=x;
	youdfs1(x,y);
	while(a[i][y]==1)
	{
		i++; 
		if(i-x>=3)
		{
			youdfs2(i-1,y);
			csumz=csum1*csum2;
			csumz%=998244353;
			csum+=csumz;
			csum%=998244353;
			int k=i-1;
			while(a[k][y]==1)
			{
				k++;
				if(k-i>=1) 
           	fx++;
			}
			fsum+=fx*csumz;
			fsum%=998244353;
			fx=0;
		}
		csum2=0;
	}
	csum1=0;
}
int main()
{
	//freopen("plant.in","r",stdin);
	//freopen("plant.out","w",stdout);
	cin>>T>>id;
	for(int diedai=1;diedai<=T;diedai++)
	{
		cin>>n>>m>>c>>f;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
			{
				cin>>b[i][j];
				if(b[i][j]=='0') a[i][j]=1;
				else a[i][j]=0;
			}
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				if(a[i][j]==1) cdfs(i,j);
		cout<<c*csum<<" "<<f*fsum<<endl;
		csum=0;
		fsum=0;
	}
	return 0;		
}

算时间复杂度的时候脑子炸了,现在我都不知道我写的是啥了……洛谷数据只有两个点TLE,INFOJ就变成除了前两个点全炸了(甚至比T4的纯暴力还要低)

2022/11/28 19:04
加载中...