社区讨论

求问一下复杂度

P1256显示图像参与者 5已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mi7xh8qx
此快照首次捕获于
2025/11/21 05:13
4 个月前
此快照最后确认于
2025/11/21 05:13
4 个月前
查看原帖
这个题用dfs的话为什么这么慢qwq,均摊算一下就是mn×一个大常数吧嘤嘤嘤,并且本机测试从别处找到的数据(似乎是官方数据)能过四个点,luogu上wa了qwq 附带程序
CPP
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int srn[1005][1005],vis[1005][1005]={0},dist[1005][1005],n,m,cnt;
int dir[3]={0,1,-1};
struct node{
	int x,y;
}e[1000005];
inline void read(int &x){
	static char rc;static int flag;
	x=0;rc=getchar();flag=1;
	while(rc<'0'||rc>'9')
	  flag=(rc=='-'?-1:1),rc=getchar();
	while(rc<='9'&&rc>='0')
	  x=x*10+rc-'0',rc=getchar();
	x=x*flag;
}
void dfs(int x,int y,int inh){
	if(x==0||y==0||x>n||y>m)return;
	if(inh>=dist[x][y])return;
	dist[x][y]=inh;
	dfs(x-1,y,inh+1);dfs(x+1,y,inh+1);
	dfs(x,y-1,inh+1);dfs(x,y+1,inh+1);
}
int main()
{
	freopen("a.out","w",stdout);
	memset(dist,127,sizeof(dist));
	char c;
	read(n),read(m);cnt=0;
	for(register int i=1;i<=n;i++){
	  for(register int j=1;j<=m;j++){
	  	c=getchar();srn[i][j]=c-'0';
	  	if(srn[i][j]==1){
	  		dist[i][j]=0;
	  		e[++cnt].x=i;e[cnt].y=j;
		  }
	  }
	  c=getchar();
	}
	while(cnt){
		for(register int i=1;i<=2;i++){
		  if(srn[e[cnt].x+dir[i]][e[cnt].y]!=1)
		  	dfs(e[cnt].x+dir[i],e[cnt].y,1);
		  if(srn[e[cnt].x][e[cnt].y+dir[i]]!=1)
		  	dfs(e[cnt].x,e[cnt].y+dir[i],1);
		}
		cnt--;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)
	  	  printf("%d ",dist[i][j]);
	  	cout<<endl;
	}
}

回复

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

正在加载回复...