为啥80分啊
查看原帖
为啥80分啊
241817
Chancylaser楼主2022/12/3 00:10

RT

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e3+5;
int T,id;
int n,m,c,f;
char s[N][N];
LL sum5[N][N],sum4[N][N], a[N][N], sum[N][N],sum2[N][N],sum3[N][N];
LL ans1,ans2;
int main(){		
	//freopen("plant3.in","r",stdin);
	scanf("%d%d",&T,&id);
	while(T--){
		scanf("%d%d%d%d",&n,&m,&c,&f);
		for(int i=1;i<=n;i++)
			scanf("%s",(s[i]+1));
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				if(s[i][j]=='1') a[i][j]=1;
		
		for(int i=n;i;i--){
			for(int j=m;j;j--){
				if(a[i][j]==0){
					sum[i][j]=sum[i][j+1]+1;
					sum2[i][j]=sum2[i+1][j]+1;
					sum4[i][j]=(sum[i][j]-1)*(sum2[i][j]-1);	
				}
				else{
					sum[i][j]=0;
					sum2[i][j]=0;
					sum4[i][j]=0;
				}
			}
		}
		for(int i=n;i;i--)
			for(int j=m;j;j--){
				if(a[i][j]==0){
					sum3[i][j]=sum3[i+1][j]+sum[i][j]-1;	
					sum5[i][j]=sum5[i+1][j]+sum4[i][j];
				}
				else sum3[i][j]=sum5[i][j]=0;
			}
		
		ans1=0; ans2=0;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				if(a[i][j]==1) continue;
				if(sum[i][j]==1) continue;
				if(sum2[i][j]<=2) continue;
				
				ans1+=(sum[i][j]-1)*(sum3[i][j]-sum[i][j]-sum[i+1][j]+2);
				ans2+=(sum[i][j]-1)*(sum5[i][j]-sum4[i][j]-sum4[i+1][j]);
			}
		}
		for(int i=1;i<=n;i++) 
			for(int j=1;j<=m;j++)
				a[i][j]=sum[i][j]=sum2[i][j]=sum3[i][j]=sum4[i][j]=sum5[i][j]=0ll;
		
		printf("%lld %lld\n",ans1*c,ans2*f);
	}
	return 0;
}

2022/12/3 00:10
加载中...