TLEon #31 #32 求助
查看原帖
TLEon #31 #32 求助
347664
菲斯斯夫斯基楼主2023/11/3 13:55

rt。这份代码在 Hydro 和 云斗 都是满分,在 uoj TLE 了最后一个点,请问怎么优化?

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10,mod=998244353;
int t,id,r,p;
int n,m,ti;
long long x,y;
char c[N][N];
int a[N][N],b[N][N];
int main()
{
//	freopen("plant.in","r",stdin);
//	freopen("plant.out","w",stdout);
//	ti=clock();
	scanf("%d%d",&t,&id);
	while(t--)
	{
		x=0,y=0;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		scanf("%d%d%d%d",&n,&m,&r,&p);
		char k;
		k=getchar();
		for(register int i=1;i<=n;++i,k=getchar())
			for(register int j=1;j<=m;++j)
				k=getchar(),c[i][j]=k;
		for(register int i=1;i<=n;++i)
			for(register int j=m;j>=1;j--)
				if(c[i][j]=='0')
					a[i][j]=a[i][j+1]+1;
		for(register int i=n;i>=1;i--)
			for(register int j=1;j<=m;++j)
				if(c[i][j]=='0')
					b[i][j]=b[i+1][j]+1;
		for(register int i=1;i<n;++i)
			for(register int j=1;j<=m;++j)
			{
				if(c[i][j]=='1'||c[i+1][j]=='1')continue;
				for(register int k=i+2;k<=n;k++)
				{
					if(c[k][j]=='1')break;
					x+=1ll*(a[i][j]-1)*(a[k][j]-1),x%=mod;
					y+=1ll*(a[i][j]-1)*(a[k][j]-1)*(b[k][j]-1),y%=mod;
				}
			}
		printf("%lld %lld\n",x*r,y*p);
	}
//	cout<<clock()-ti<<endl;
	return 0;
}
2023/11/3 13:55
加载中...