![]()
![]()
![]()
![]()
![]()
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 using namespace std;
5 const int maxn=507;
6 int h[maxn][maxn],l[maxn][maxn],r[maxn][maxn],ans1,ans2;
7 int n,m;
8 bool vis[maxn][maxn],flag;
9 int dx[4]={0,1,0,-1};
10 int dy[4]={-1,0,1,0};
11 void dfs(int x,int y){
12 vis[x][y]=true;
13 for(int i=0;i<4;i++){
14 if(x+dx[i]<1||x+dx[i]>n||y+dy[i]<1||y+dy[i]>m) continue;
15 if(h[x+dx[i]][y+dy[i]]>=h[x][y]) continue;
16 if(!vis[x+dx[i]][y+dy[i]]) dfs(x+dx[i],y+dy[i]);
17 l[x][y]=min(l[x][y],l[x+dx[i]][y+dy[i]]);
18 r[x][y]=max(r[x][y],r[x+dx[i]][y+dy[i]]);
19 }
20 }
21 int main(){
22 memset(l,0x7f,sizeof(l));
23 cin>>n>>m;
24 for(int i=1;i<=n;i++)
25 for(int j=1;j<=m;j++)
26 cin>>h[i][j];
27 for(int i=1;i<=m;i++)
28 l[n][i]=i,r[n][i]=i;//因为只初始化了沙漠地区,所以是沙漠地区的值不断往上传
29 for(int i=1;i<=m;i++)
30 if(!vis[1][i]) dfs(1,i);
31 for(int i=1;i<=m;i++){
32 if(!vis[n][i]) ans1++;
33 }
34 if(ans1>0) cout<<0<<endl<<ans1<<endl;
35 else{
36 int sta=1,end=1;
37 while(sta<=m){//end<=m错,end永远<=m
38 for(int i=1;i<=m;i++){
39 if(l[1][i]<=sta){
40 end=max(end,r[1][i]);
41 }
42 }
43 ans2++;
44 sta=end+1;
45 }
46 cout<<1<<endl<<ans2<<endl;
47 }
48 return 0;
49 }