提交时间:2026-01-04 15:45:44
运行 ID: 81312
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define nx x+xx[i] #define ny y + yy[i] const int M = 510; int n, m; int a[M][M]; int mi[M][M], ma[M][M]; bool f[M][M]; int xx[4] = {-1, 0, 1, 0}; int yy[4] = {0, 1, 0, -1}; void dfs(int x, int y){ f[x][y] = true; for (int i = 0; i < 4; i++){ if (nx < 1 || nx > n || ny < 1 || ny > m) continue; if (a[nx][ny] >= a[x][y]) continue; if (!f[nx][ny]) dfs(nx, ny); mi[x][y] = min(mi[nx][ny], mi[x][y]); ma[x][y] = max(ma[nx][ny], ma[x][y]); } return; } int main(){ memset(f, false, sizeof(f)); memset(ma, 0, sizeof(ma)); memset(mi, 0x3f, sizeof(mi)); cin >> n >> m; for (int i = 1; i <= n; i++){ for (int j = 1; j <= m; j++){ cin >> a[i][j]; } } for (int j = 1; j <= m; j++){ mi[n][j] = ma[n][j] = j; } for (int j = 1; j <= m; j++){ if (!f[1][j]) dfs(1, j); } bool flag = false; int cnt = 0; for (int j = 1; j <= m; j++){ if (!f[n][j]){ flag = true; cnt++; } } if (flag){ cout << 0 << endl << cnt << endl; return 0; } int l = 1; while (l <= m){ int mr = 0; for (int i = 1; i <= m; i++){ if (mi[1][i] <= l){ mr = max(mr, ma[1][i]); } } cnt++; l = mr + 1; } cout << 1 << endl << cnt << endl; return 0; }