#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=550,MAX=0x7fffffffffffffff;
int n,m,a[N][N],b[N][N],d[N],ans;
int aa[]={1,-1,0,0},bb[]={0,0,1,-1};
int k;
struct nb{
int L,R;
}c1[N],c2[N];
bool cmp(const nb &x,const nb &y)
{
if(x.L==y.R)
{
return x.R>y.R;
}
return x.L<y.L;
}
void dfs(int x,int y,int xsc)
{
b[x][y]=1;
if(x==n)
{
d[y]=1;
c1[xsc].L=min(c1[xsc].L,y);
c1[xsc].R=max(c1[xsc].R,y);
}
for(int i=0;i<4;i++)
{
int xx=x+aa[i],yy=y+bb[i];
if(xx<=n && yy<=m && xx>=1 && yy>=1 && a[xx][yy]<a[x][y] && !b[xx][yy])
{
dfs(xx,yy,xsc);
}
}
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
c1[i].L=MAX;
c1[i].R=-1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
for(int i=1;i<=m;i++)
{
if((a[1][i]>=a[1][i-1]) && (a[1][i]>=a[1][i+1]))
{
dfs(1,i,i);
}
memset(b,0,sizeof(b));
}
int p=0;
for(int i=1;i<=m;i++)
{
if(d[i]==0)
{
p++;
}
}
if(p==1)
{
printf("0\n%d",p);
}
else
{
printf("1\n");
for(int i=1;i<=m;i++)
{
if(c1[i].L!=MAX && c1[i].R!=0)
{
k++;
c2[k].L=c1[i].L;
c2[k].R=c1[i].R;
}
}
sort(c2+1,c2+k+1,cmp);
int left=1;
while(left<=m)
{
int maxr=0;
for(int i=1;i<=k;i++)
{
if(c2[i].L<=left)
{
maxr=max(maxr,c1[i].R);
}
else
{
break;
}
}
ans++;
left=maxr+1;
}
printf("%d\n",ans);
}
return 0;
}
为啥这么写会全部测试点TLE啊,各位大佬。