#include <bits/stdc++.h>
#define ll long long
#define maxn 100011
using namespace std;
int n,m;
int mp[551][551],cnt;
int ans,tot;
int dir[4][2] = {{1,0},{0,1},{0,-1},{-1,0}};
bool book[5111],op[551][551];
queue<pair<int,int> > q;
inline ll read() {
ll res,op = 1;
char ch;
while((ch=getchar())<'0' || ch > '9') if(ch == '-') op = -1;
res = (ll)(ch - '0');
while((ch = getchar())<='9' && ch >= '0')
res = (res<<1) + (res<<3) + (ll)(ch - '0');
return res * op;
}
struct node{
int l,r;
}a[1011];
bool cmp(node a,node b) {
if(a.l == b.l)
return a.r > b.r;
return a.l < b.l;
}
int main()
{
memset(book,false,sizeof(book));
n = read(),m = read();
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++)
mp[i][j] = read();
for(int i = 1;i <= m;i++)
{
memset(op,false,sizeof(op));
q.push(make_pair(1,i));
int lr = 511,rr = 0;
// printf("%d %d\n",1,i);
while(!q.empty())
{
int tx = q.front().first,ty = q.front().second;
q.pop();
int rx,ry;
for(int i = 0;i < 4;i++)
{
rx = tx + dir[i][0];
ry = ty + dir[i][1];
if(!op[rx][ry] && rx <= n && rx >= 1 && ry <= m && ry >= 1 && mp[tx][ty] > mp[rx][ry])
{
op[rx][ry] = true;
// printf("%d %d ",rx,ry);
q.push(make_pair(rx,ry));
if(rx == n) lr = min(lr,ry),rr = max(rr,ry),book[ry] = true;
}
}
}
// printf("\n");
if(lr != 511)
a[++cnt].l = lr,a[cnt].r = rr;
if(a[cnt].l == 1 && a[cnt].r == m) break;
}
if(n == 1)
for(int i = 1;i <= m;i++)
a[++cnt].l = a[cnt].r = i;
for(int i = 1;i <= m;i++)
if(book[i])
tot++;
if(tot != m && n != 1) {
printf("0\n%d\n",m-tot);
return 0;
}
else {
int fr = a[1].r,fl = a[1].r;
ans = 1;
sort(a+1,a+1+cnt,cmp);
int j = 2,i = 2;
while(1) {
if(fl >= m)
break;
j = i;
while(a[j].l <= fl+1)
j++;
for(int k = i;k < j;k++)
fl = max(fl,a[k].r);
ans++;
i = j;
if(i > cnt)
break;
}
/*
for(int i = 2;i <= m;i++) {
if(a[i].l > fl+1)
fl = fr,ans++,printf("%d\n",fl);
if(a[i].l <= fl+1)
fr = max(fr,a[i].r);
if(fl == m)
break;
}
*/
printf("1\n%d\n",ans);
}
return 0;
}
第七个点TLE了