社区讨论
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 条回复,欢迎继续交流。
正在加载回复...