WA on #31 #32 #16 求助
查看原帖
WA on #31 #32 #16 求助
638537
g1ove楼主2023/11/3 13:12

这是 TLE code

其中 sumi,jsum_{i,j} 表示第 ii 行从右往左遇见第一个 11 之前 00 个数

ss 数组代表从下往上

#include<bits/stdc++.h>
#define N 1005
#define ll long long
using namespace std;
const int mod=998244353;
int g,id;
int n,m,c,f;
char a[N][N];
int sum[N][N],s[N][N];
int sc,sf;
int main() 
{
//	freopen("plant3.in","r",stdin);
	scanf("%d%d",&g,&id);
	while(g--)
	{
		memset(sum,0,sizeof(sum));
		memset(s,0,sizeof(s));
		scanf("%d%d%d%d",&n,&m,&c,&f);
		sc=sf=0;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				cin>>a[i][j],a[i][j]-='0';
		for(int i=1;i<=n;i++)
			for(int j=m;j>=1;j--)
				if(!a[i][j]) sum[i][j]=sum[i][j+1]+1;
				else sum[i][j]=0;
		for(int j=1;j<=m;j++)
			for(int i=n;i>=1;i--)
				if(!a[i][j])s[i][j]=s[i+1][j]+1;
				else s[i][j]=0;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
			{
				if(a[i][j]||a[i+1][j]) continue;
				for(int k=i+2;k<=n;k++)
				{
					if(a[k][j]) break;
					sc=(sc+1ll*(sum[i][j]-1)*(sum[k][j]-1)%mod)%mod;
					sf=sf+(sum[i][j]-1)*(sum[k][j]-1)%mod*(s[k][j]-1)%mod,sf%=mod;
				}
			}
		printf("%d %d\n",sc*c,f*sf);
	}
	return 0;
}

对代码进行优化 得到的 WA 代码

#include<bits/stdc++.h>
#define N 1005
#define int long long
using namespace std;
const int mod=998244353;
int g,id;
int n,m,c,f;
char a[N][N];
int sum[N][N],s[N][N];
int gc[N][N],gf[N][N],lst[N][N];
int sc,sf;
signed main() 
{
	scanf("%d%d",&g,&id);
	while(g--)
	{
		memset(sum,0,sizeof(sum));
		memset(s,0,sizeof(s));
		memset(gc,0,sizeof(gc));
		memset(gf,0,sizeof(gf));
		memset(lst,0,sizeof(lst));
		scanf("%d%d%d%d",&n,&m,&c,&f);
		sc=sf=0;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				cin>>a[i][j],a[i][j]-='0';
		for(int i=1;i<=n;i++)
			for(int j=m;j>=1;j--)
				if(!a[i][j]) sum[i][j]=sum[i][j+1]+1;
				else sum[i][j]=0;
		for(int i=1;i<=m;i++)
			lst[n+1][i]=n+1;
		for(int j=1;j<=m;j++)
			for(int i=n;i>=1;i--)
			{
				if(!a[i][j])lst[i][j]=lst[i+1][j],s[i][j]=s[i+1][j]+1;
				else s[i][j]=0,lst[i][j]=i;
				gc[i][j]=gc[i+1][j]+sum[i][j]-1,gc[i][j]%=mod;
				gf[i][j]=gf[i+1][j]+1ll*(sum[i][j]-1)*(s[i][j]-1)%mod,gf[i][j]%=mod;
			}
		for(int i=1;i<=n-2;i++)
		{
			for(int j=1;j<=m;j++)
			{
				if(a[i][j]||a[i+1][j]) continue;
				sc=sc+1ll*(sum[i][j]-1)*(gc[i+2][j]-gc[lst[i][j]][j]+mod)%mod;
				sf=sf+1ll*(sum[i][j]-1)*(gf[i+2][j]-gf[lst[i][j]][j]+mod)%mod;
			}
		}
		printf("%d %d\n",sc*c,f*sf);
	}
	return 0;
}

2023/11/3 13:12
加载中...