#include<bits/stdc++.h>
using namespace std;
const int dx[4] = {0, 0, 1, -1};
const int dy[4] = {1, -1, 0, 0};
const int N = 505;
/*struct debug
{
int x, int y;
};*/
struct Node
{
int x, y;
//(x, y) -> (l, r)
//debug
int idx;
};
int min(int a, int b)
{
return (a > b) ? b : a;
}
int max(int a, int b)
{
return (a > b) ? a : b;
}
bool vis[N][N], vis1[N], vis2[N], con = 1;
int n, m, a[N][N], ans = 0, de;
Node lr[N];
void bfs(int x, int y)
{
//printf("Try to start search(%d, %d)\n", x, y);
Node tep, f;
queue<Node> q1;
tep.x = x; tep.y = y;
q1.push(tep);
int maxx = 0, minn = INT_MAX;
while(!q1.empty()) {
f = q1.front();
q1.pop();
//printf(" (%d, %d) arrive (%d, %d)\n", x, y, f.x, f.y);
//if(vis[f.x][f.y]) {
// continue;
//}
if(f.x == 0) {
vis1[f.y] = true;
//printf("(%d, %d) arrive (%d, %d)\n", x, y, f.x, f.y);
}
if(f.x == n-1) {
printf("(%d, %d) arrive (%d, %d) update(%d,%d)", x, y, f.x, f.y, minn, maxx);
minn = min(minn, f.y);
maxx = max(maxx, f.y);
vis2[f.y] = true;
printf("to(%d,%d)\n", minn, maxx);
}
vis[f.x][f.y] = true;
for(int i = 0; i < 4; i++) {
if(f.x+dx[i] == n-1 && f.y+dy[i] == 6) {
printf("(%d, %d)(%d, %d)(%d, %d), %d %d %d %d %d %d\n", a[f.x][f.y], a[f.x+dx[i]][f.y+dy[i]], f.x, f.y, f.x+dx[i], f.y+dy[i], 0 <= f.x+dx[i], f.x+dx[i] < n, 0 <= f.y+dy[i], f.y+dy[i] < m, !vis[f.x+dx[i]][f.y+dy[i]], a[f.x][f.y] > a[f.x+dx[i]][f.y+dy[i]]);
}
if(0 <= f.x+dx[i] && f.x+dx[i] < n && 0 <= f.y+dy[i] && f.y+dy[i] < m && !vis[f.x+dx[i]][f.y+dy[i]] && a[f.x][f.y] > a[f.x+dx[i]][f.y+dy[i]]) {
tep.x = f.x+dx[i]; tep.y = f.y+dy[i];
vis[tep.x][tep.y] = true;
q1.push(tep);
}
}
}
if(minn == INT_MAX) {
lr[y].x = -1; lr[y].y = -1;
lr[y].idx = y;
}
else {
for(int i = maxx; i <= minn; i++) {
if(!vis[n-1][i]) {
//printf("Ops change con [%d, %d](%d, %d)\n", minn, maxx, x, y);
con = 0;
return;
}
}
lr[y].x = minn; lr[y].y = maxx; lr[y].idx = y;
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
vis[i][j] = false;
}
}
}
bool cmp(Node a, Node b)
{
return (a.x == b.x) ? (a.y < b.y) : (a.x < b.x);
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
scanf("%d", &a[i][j]);
}
}
//a[0][0~m-1] 临水
//a[n-1][0~m-1]临沙
for(int i = 0; i < m; i++) {
if(!vis1[i]) {
bfs(0, i);
}
else if(vis1[i]) {
lr[i].x = -1; lr[i].y = -1;
lr[i].idx = i;
}
}
for(int i = 0; i < m; i++) {
ans += !vis2[i];
}
//printf("ans:%d\n", ans);
if(con && !ans) {
sort(lr, lr+m, cmp);
int iter = 0, r = -1, maxx = 0;
while(lr[iter].x < 0) iter++;
for(int i = 0; i < m; i++) {
for(int j = 0; j < m; j++) {
if(lr[j].x>r+1) break;
if(lr[j].y > maxx) de = j;
maxx = max(maxx, lr[j].y);
}
r = maxx;
//printf("Round%d, (%d,%d,%d)", i, lr[de].x, lr[de].y, lr[de].idx);
ans++;
if(r >= m-1) {
printf("1\n%d\n", ans);
for(int i = 0; i < m; i++) {
printf("(%d, %d, %d)\n", lr[i].x, lr[i].y, lr[i].idx);
}
for(int i = 0; i < m; i++) {
printf("%d ", vis1[i]);
}
printf("\n");
for(int i = 0; i < m; i++) {
printf("%d ", vis2[i]);
}
printf("\n");
return 0;
}
}
}
else {
printf("0\n%d\n", m-ans);
}
/*for(int i = 0; i < m; i++) {
printf("(%d, %d, %d)\n", lr[i].x, lr[i].y, lr[i].idx);
}
for(int i = 0; i < m; i++) {
printf("%d ", vis1[i]);
}
printf("\n");
for(int i = 0; i < m; i++) {
printf("%d ", vis2[i]);
}
printf("\n");*/
return 0;
}
附有#1的样例图 输出0 7
输入为: