Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
134047 | 廖悦扬 | 引水入城 | C++ | 通过 | 100 | 32 MS | 14116 KB | 1540 | 2024-03-02 11:32:31 |
#include <bits/stdc++.h> #define int long long using namespace std; const int N = 500 + 5; int n, m, g[N][N], l[N][N], r[N][N], vis[N][N]; int dx[] = {1, -1, 0, 0}; int dy[] = {0, 0, 1, -1}; struct st{ int l, r; bool operator<(const st& a) { return r < a.r; } } stu[N]; inline bool inr(int x, int y) { return x >= 1 && y >= 1 && x <= n && y <= m; } void dfs(int x, int y) { if (vis[x][y]) return; vis[x][y] = 1; for (int i=0; i<4; i++) { int tx = x + dx[i], ty = y + dy[i]; if (!inr(tx, ty) || g[tx][ty] >= g[x][y]) continue; dfs(tx, ty); l[x][y] = min(l[x][y], l[tx][ty]); r[x][y] = max(r[x][y], r[tx][ty]); // printf("TXTY %d %d: %d %d (%d, %d)\n", tx, ty, l[tx][ty], r[tx][ty], x, y); } } signed main() { scanf("%d%d", &n, &m); for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) scanf("%d", &g[i][j]); memset(l, 0x3f, sizeof l); memset(r, -0x3f, sizeof r); for (int i=1; i<=m; i++) r[n][i] = l[n][i] = i; for (int i=1; i<=m; i++) { dfs(1, i); } int cnt = 0, ans = 0; for (int i=1; i<=m; i++) { if (!vis[n][i]) cnt++; } if (cnt) { printf("0\n%d", cnt); return 0; } else { for (int i=1; i<=m; i++){ // printf("LR: %d %d\n", l[1][i], r[1][i]); stu[i].l = l[1][i]; stu[i].r = r[1][i]; } int cur = 1, mx=0; while (cur <= m) { for (int i=1; i<=m; i++) { if (stu[i].l <= cur) { mx = max(mx, stu[i].r+1); } } ans++; cur = mx; mx = 0; } printf("1\n%d", ans); } return 0; }