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