清空数组了,但没有完全清空
  • 板块灌水区
  • 楼主z_y_
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/11/27 21:50
  • 上次更新2023/10/27 01:09:16
查看原帖
清空数组了,但没有完全清空
556472
z_y_楼主2022/11/27 21:50

如这个6分的代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1010;
const ll mod=998244353;
int t,id,c,f,n,m,sum[MAXN][MAXN];
char mp[MAXN][MAXN];
ll mx1[MAXN][MAXN],mx2[MAXN][MAXN],sum1[MAXN][MAXN],sum2[MAXN][MAXN],ansc,ansf;
int getsum(int i,int j,int l,int r){
	return sum[i][j]-sum[i][r-1]-sum[l-1][j]+sum[l-1][r-1];
}
int main(){
	freopen("plant.in","r",stdin);
	freopen("plant.out","w",stdout);
	scanf("%d%d",&t,&id);
	while(t--){
		memset(mx1,0,sizeof(mx1));
		memset(mx2,0,sizeof(mx2));
		ansc=ansf=0; 
		scanf("%d%d%d%d",&n,&m,&c,&f);
		for(int i=1;i<=n;i++)
			scanf("%s",mp[i]+1);
		if(id==1){
			printf("0 0\n");
			continue ;
		}
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+mp[i][j]-'0';
		for(int i=1;i<=n;i++)
			for(int j=m;j>0;j--)
				if(mp[i][j]=='1')
					mx1[i][j]=0;
				else
					mx1[i][j]=mx1[i][j+1]+1;
		for(int j=1;j<=m;j++)
			for(int i=n;i>=1;i--)
				if(mp[i][j]=='1')
					mx2[i][j]=0;
				else
					mx2[i][j]=mx2[i+1][j]+1;
		for(int j=1;j<=m;j++)
			for(int i=n;i>=1;i--)
				if(mp[i][j]=='1')
					sum1[i][j]=sum2[i][j]=0;
				else{
					sum1[i][j]=(sum1[i+1][j]+mx1[i][j]-1)%mod;
					sum2[i][j]=(sum2[i+1][j]+(mx1[i][j]-1)*(mx2[i][j]-1)%mod)%mod;
				}
		for(int i=1;i<=n-2;i++)
			for(int j=1;j<=m-1;j++)
				if(mp[i][j]=='0' && mp[i+1][j]=='0' && mp[i+2][j]=='0')
				{
					ansc+=(mx1[i][j]-1)*sum1[i+2][j]%mod,ansc%=mod;
					ansf+=(mx1[i][j]-1)*sum2[i+2][j]%mod,ansf%=mod;
				}

//				for(int k=i+2;k<=n;k++)
//					if(mp[i][j]=='0' && mp[k][j]=='0' && getsum(k,j,i,j)==0)
//					{
////						printf("%d %d %d %lld\n",i,j,k,ansc);
//						ansc=(ansc+(mx1[i][j]-1)*(mx1[k][j]-1))%mod;
//						ansf=(ansf+(mx1[i][j]-1)*(mx1[k][j]-1)%mod*(mx2[k][j]-1))%mod;
//					}
		printf("%lld %lld\n",ansc*c,ansf*f);
	}	
	return 0;
}

原地AFO

2022/11/27 21:50
加载中...