社区讨论

TLE了两个,如何优化,蒟蒻求助

P8865[NOIP2022] 种花参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo7g8bwa
此快照首次捕获于
2023/10/27 01:19
2 年前
此快照最后确认于
2023/10/27 01:19
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
int T,id;
int n,m,c,f;
int s[1005][1005];
string a;
unsigned long long ans_c=1,ans_f=1;
int ans_c1,ans_f1;
int sum_c,sum_f;
int sum_f1;
void pd_c(int x,int y)
{
	for(int i=1;i<=m-x;i++)
	{
		if(s[y][x+i]!=48)
			break;
		else
			ans_c1++;
	}
	ans_c*=ans_c1;
	ans_c1=0;
	for(int i=y+2;i<=n;i++)
	{
		if(s[i][x]!=48)
			break;
		if(i+1>y)
		{
			if(s[i][x]!=48)
				return;
			for(int j=x+1;j<=m;j++)
			{
				if(s[i][j]!=48)
					break;
				else
					ans_c1++;
			}
			if(ans_c1!=0)
			{
				sum_c+=(ans_c1*ans_c);
				ans_c1=0;
			}
		}
	}
}
void dfs_c(int x,int y)
{
	if(y>n-1)
		return;
	if(s[y][x]==48&&s[y+1][x]==48&&s[y+2][x]==48&&s[y][x+1]==48)
	{
		pd_c(x,y);
		ans_c=1;
	}
	if(x<=m)
		dfs_c(x+1,y);
	else
		dfs_c(1,y+1);
	return;
}
void pd_f(int x,int y)
{
	for(int i=1;i<=m-x;i++)
	{
		if(s[y][x+i]!=48)
			break;
		else
			ans_f1++;
	}
	ans_f*=ans_f1;
	ans_f1=0;
	for(int i=y+1;i<n;i++)
	{
		if(s[i+1][x]!=48)
			break;
		if(i>y+1)
		{
			if(s[i][x]!=48)
				return;
			for(int j=x+1;j<=m;j++)
			{
				if(s[i][j]!=48)
					break;
				else
					ans_f1++;
			}
			if(ans_f1!=0)
			{
				sum_f1+=(ans_f1*ans_f);
				ans_f1=0;
				for(int k=i;k<=n;k++)
				{
					if(s[k+1][x]!=48)
						break;
					else
						ans_f1++;
				}
				if(ans_f1!=0)
				{
					sum_f1*=ans_f1;
					sum_f+=sum_f1;
					sum_f1=0;
					ans_f1=0;
				}
			}
		}
	}
}
void dfs_f(int x,int y)
{
	if(y>n-1)
		return;
	if(s[y][x]==48&&s[y+1][x]==48&&s[y+2][x]==48&&s[y+3][x]==48)
	{
		if(s[y][x+1]==48)
		{
			pd_f(x,y);
			ans_f=1;
		}
	}
	if(x<=m)
		dfs_f(x+1,y);
	else if(x>m)
		dfs_f(1,y+1);
	return;
}
int main()
{
	freopen("plant.in","r",stdin);
	freopen("plant.out","w",stdout);
	scanf("%d %d",&T,&id);
	while(T)
	{
		scanf("%d %d %d %d",&n,&m,&c,&f);
		for(int i=1;i<=n;i++)
		{
			cin>>a;
			for(int j=1;j<=m;j++)
				s[i][j]=a[j-1];
		}
		dfs_c(1,1);
		dfs_f(1,1);
		printf("%d %d\n",c*sum_c%998244353,f*sum_f%998244353);
		sum_c=0;
		sum_f=0;
		T--;
		if(T==0)
			return 0;
		s[1002][1002]=0; 
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...