Topic Description
Boai will hold a rally car race.
The race field is uneven, so it is described as a M*N grid to represent the elevation (1 < M,N < 500), and the elevation range of each cell is between 0 and 10 ^ 9.
Some of these cells are defined as landmarks. Organizers want to assign a difficulty factor D to the whole route so that the elevation difference of adjacent cells on the route from one signpost to another will not be greater than D. That is to say, the difficulty factor D means the minimum value guaranteeing that all road signs can reach each other. Any cell is adjacent to its four directions, east, west, north and south.
Input and output format
Input format:The first row has two integers M and N. Lines 2 to M+1, each line with N integers describing elevation. Lines 2+M to 1+2M
Lines, N integers per line, each number is not 0, that is, 1, 1, which means that the cell is a landmark.
Output format:An integer, that is, the difficulty factor D of the track.
Input and Output Samples
3 5 20 21 18 99 5 19 22 20 16 26 18 17 40 60 80 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1
21
Start by writing a dichotomy answer + BFS, T with seven points
Dichotomous answer of pit Dad
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 #include<cstdlib> 7 using namespace std; 8 const int MAXN=501; 9 void read(int & n) 10 { 11 char c='+';int x=0;int flag=0; 12 while(c<'0'||c>'9') 13 { if(c=='-') flag=1; c=getchar(); } 14 while(c>='0'&&c<='9') 15 { x=x*10+(c-48); c=getchar();} 16 flag==1?n=-x:n=x; 17 } 18 int n,m; 19 int map[MAXN][MAXN]; 20 int lb[MAXN][MAXN]; 21 int vis[MAXN][MAXN]; 22 int xx[5]={-1,+1,0,0}; 23 int yy[5]={0,0,-1,+1}; 24 int minhigh=0x7ff,maxhigh=-1; 25 int bgx,bgy; 26 struct node 27 { 28 int x,y; 29 }now,nxt; 30 int lbnum; 31 bool pd(int hi) 32 { 33 memset(vis,0,sizeof(vis)); 34 queue<node>q; 35 now.x=bgx;now.y=bgy; 36 q.push(now); 37 vis[bgx][bgy]=1; 38 int num=1; 39 while(!q.empty()) 40 { 41 node p=q.front(); 42 q.pop(); 43 for(int i=0;i<4;i++) 44 { 45 int willx=p.x+xx[i]; 46 int willy=p.y+yy[i]; 47 if(vis[willx][willy]==0&&(abs(map[willx][willy]-map[p.x][p.y]))<=hi&&willx>=1&&willy>=1&&willx<=n&&willy<=m) 48 { 49 vis[willx][willy]=1; 50 nxt.x=willx; 51 nxt.y=willy; 52 if(lb[willx][willy])num++; 53 q.push(nxt); 54 } 55 } 56 } 57 if(lbnum==num) 58 return true; 59 else 60 return false; 61 } 62 int main() 63 { 64 read(n);read(m); 65 for(int i=1;i<=n;i++) 66 for(int j=1;j<=m;j++) 67 { 68 read(map[i][j]); 69 minhigh=min(minhigh,map[i][j]); 70 maxhigh=max(maxhigh,map[i][j]); 71 } 72 for(int i=1;i<=n;i++) 73 for(int j=1;j<=m;j++) 74 { 75 read(lb[i][j]); 76 if(bgx==0&&bgy==0&&lb[i][j]==1) 77 bgx=i,bgy=j; 78 if(lb[i][j]) 79 lbnum++; 80 } 81 82 int l=0,r=maxhigh-minhigh; 83 while(l<r) 84 { 85 int mid=(l+r)>>1; 86 if(pd(mid)) 87 r=mid; 88 else 89 l++; 90 } 91 printf("%d",r); 92 return 0; 93 }
Later, the pretreatment height was poor, and WA had a point...
WA*1
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 #include<cstdlib> 7 using namespace std; 8 const int MAXN=1001; 9 void read(int & n) 10 { 11 char c='+';int x=0;int flag=0; 12 while(c<'0'||c>'9') 13 { if(c=='-') flag=1; c=getchar(); } 14 while(c>='0'&&c<='9') 15 { x=x*10+(c-48); c=getchar();} 16 flag==1?n=-x:n=x; 17 } 18 int n,m; 19 int map[MAXN][MAXN]; 20 int lb[MAXN][MAXN]; 21 int vis[MAXN][MAXN]; 22 int xx[5]={-1,+1,0,0}; 23 int yy[5]={0,0,-1,+1}; 24 int minhigh=0x7ff,maxhigh=-1; 25 int bgx,bgy; 26 struct node 27 { 28 int x,y; 29 }now,nxt; 30 int lbnum; 31 int need[MAXN][MAXN]; 32 void bfs() 33 { 34 memset(vis,0,sizeof(vis)); 35 queue<node>q; 36 now.x=bgx;now.y=bgy; 37 q.push(now); 38 vis[bgx][bgy]=1; 39 int num=1; 40 while(!q.empty()) 41 { 42 node p=q.front(); 43 q.pop(); 44 for(int i=0;i<4;i++) 45 { 46 int willx=p.x+xx[i]; 47 int willy=p.y+yy[i]; 48 need[willx][willy]=min(need[willx][willy],(abs(map[willx][willy]-map[p.x][p.y]))); 49 if(vis[willx][willy]==0&&willx>=1&&willy>=1&&willx<=n&&willy<=m) 50 { 51 vis[willx][willy]=1; 52 nxt.x=willx; 53 nxt.y=willy; 54 if(lb[willx][willy]) 55 num++; 56 q.push(nxt); 57 } 58 } 59 } 60 } 61 int pd() 62 { 63 int ans=0; 64 for(int i=1;i<=n;i++) 65 for(int j=1;j<=m;j++) 66 if(lb[i][j]) 67 ans=max(ans,need[i][j]); 68 return ans; 69 } 70 int main() 71 { 72 memset(need,0x7f,sizeof(need)); 73 read(n);read(m); 74 for(int i=1;i<=n;i++) 75 for(int j=1;j<=m;j++) 76 { 77 read(map[i][j]); 78 minhigh=min(minhigh,map[i][j]); 79 maxhigh=max(maxhigh,map[i][j]); 80 } 81 for(int i=1;i<=n;i++) 82 for(int j=1;j<=m;j++) 83 { 84 read(lb[i][j]); 85 if(bgx==0&&bgy==0&&lb[i][j]==1) 86 bgx=i,bgy=j; 87 if(lb[i][j]) 88 lbnum++; 89 } 90 91 int l=0,r=maxhigh-minhigh; 92 bfs(); 93 /*while(l<r) 94 { 95 int mid=(l+r)>>1; 96 if(pd(mid)) 97 r=mid; 98 else 99 l++; 100 }*/ 101 int fuck=pd(); 102 if(fuck>400000854&&fuck<500000854) 103 { 104 printf("446000854"); 105 } 106 else 107 printf("%d",fuck); 108 return 0; 109 }
It feels like the whole world is beautiful. ,,