P8865 种CCF花 前缀套前缀

太笨了码了两天,放个代码就跑路了,以后看吧
https://www.luogu.com.cn/problem/P8865

#include <bits/stdc++.h>
using namespace std;
typedef long long int LL;
char ch;
LL T,id,n,m,c,f,MOD=998244353,temp,jpre[1005][1005],ipre[1005][1005],s,vc,vf,maps[1005][1005],sum_c[1005][1005],sum_f[1005][1005];
int main() {
	cin>>T>>id;
	while(T--)
	{
		memset(jpre,0,sizeof(jpre));
		memset(ipre,0,sizeof(ipre));
		memset(maps,0,sizeof(maps));
		memset(sum_c,0,sizeof(sum_c));
		memset(sum_f,0,sizeof(sum_f));
		cin>>n>>m>>c>>f;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				while(!isdigit(ch=getchar()));
				temp=ch-'0';
				maps[i][j]=temp;
			}
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=m-1;j>=1;j--)
			{
				if(maps[i][j]==0&&maps[i][j+1]==0) jpre[i][j]=jpre[i][j+1]+1;
			}
		}
		for(int j=1;j<=m-1;j++)
		{
			for(int i=n-1;i>=1;i--)
			{
				if(maps[i][j]==0&&maps[i+1][j]==0) ipre[i][j]=ipre[i+1][j]+1;
			}
		}
		for(int sj=1;sj<=m-1;sj++)
		{
			for(int si=n;si>=1;si--)
			{
				if(maps[si][sj]==1) continue;
				sum_c[si][sj]=jpre[si][sj]+sum_c[si+1][sj];
				sum_c[si][sj]%=MOD;
				if(si==n) continue;
				sum_f[si][sj]=jpre[si][sj]*ipre[si][sj]+sum_f[si+1][sj];
				sum_f[si][sj]%=MOD;
			}
		}
		for(int sj=1;sj<=m-1;sj++)
		{
			for(int si=1,leng=1;si<=n-2;si++)
			{
				leng=ipre[si][sj]+1;
				if(leng<3) continue;
				int ba=jpre[si][sj];
				if(ba<=0) continue;
				vc+=ba*sum_c[si+2][sj]%MOD;
				vc%=MOD;
				if(leng>=4)
				{
					vf+=ba*sum_f[si+2][sj]%MOD;
					vf%=MOD;
				}
			}
		}
		cout<<vc*c<<" "<<vf*f<<endl;
		vc=0,vf=0;
	}
	return 0;
}
posted @   石磨豆浆  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示