代码
#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[600][600],vis[600][600],js[600];
struct node{
int res;
map<int,int> ha;
}ans[600];
int dx[4]={0,1,-1,0};
int dy[4]={-1,0,0,1};
bool cmp(node x,node y){
if(x.res==y.res){
for(int i=1;i<=m;i++){
if(x.ha[i]>y.ha[i]) return 1;
if(x.ha[i]<y.ha[i]) return 0;
}
}
return x.res>y.res;
}
void bfs(int x,int y){
vis[x][y]=1;
queue<pair<int,int> > q;
q.push(make_pair(x,y));
while(!q.empty()){
pair<int,int> t=q.front();
q.pop();
if(t.first==1){
if(!ans[t.second].ha[y]){
ans[t.second].res++;
ans[t.second].ha[y]=1;
}
}
for(int i=0;i<4;i++){
int tx=dx[i]+t.first;
int ty=dy[i]+t.second;
if(tx>=1 && tx<=n && ty>=1 && ty<=m && !vis[tx][ty] && a[tx][ty]>a[t.first][t.second]){
q.push(make_pair(tx,ty));
if(tx>1) vis[tx][ty]=1;
}
}
}
return ;
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=m;i++){
memset(vis,0,sizeof vis);
bfs(n,i);
}
sort(ans+1,ans+1+m,cmp);
int fg=0;
for(int i=1;i<=m;i++){
int f=1,f1=0;
for(int j=1;j<=m;j++){
if(!js[j]){
f=0;
break;
}
}
if(f){
cout<<1<<endl<<i-1-fg;
return 0;
}
for(int j=1;j<=m;j++){
if(ans[i].ha[j]){
if(js[j]) f1++;
js[j]++;
}
}
if(f1==ans[i].res) fg++;
}
int rres=0;
for(int j=1;j<=m;j++){
if(!js[j]) rres++;
}
cout<<0<<endl<<rres;
return 0;
}