记录编号 605123 评测结果 AAWAAAAAAA
题目名称 521.[NOIP 2010]引水入城 最终得分 90
用户昵称 Gravatarxpb 是否通过 未通过
代码语言 C++ 运行时间 0.295 s
提交时间 2025-08-14 11:36:25 内存使用 5.22 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 505;
int n, m, h[N][N], L[N][N], R[N][N];
int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
struct P {
    int x, y, h;
    bool operator<(const P& o) const { return h < o.h; }
};

struct I {
    int l, r;
    bool operator<(const I& o) const { return l < o.l; }
};

int main() {
    freopen("flow.in", "r", stdin);
    freopen("flow.out", "w", stdout);
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> h[i][j];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            if (i == n - 1) L[i][j] = R[i][j] = j;
            else L[i][j] = N, R[i][j] = -1;
    vector<P> ps;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            ps.push_back({i, j, h[i][j]});
    sort(ps.begin(), ps.end());
    for (auto p : ps) {
        int x = p.x, y = p.y;
        for (int d = 0; d < 4; d++) {
            int nx = x + dx[d], ny = y + dy[d];
            if (nx < 0 || nx >= n || ny < 0 || ny >= m || h[nx][ny] >= h[x][y]) continue;
            L[x][y] = min(L[x][y], L[nx][ny]);
            R[x][y] = max(R[x][y], R[nx][ny]);
        }
    }
    vector<bool> cov(m);
    vector<I> ivs;
    for (int j = 0; j < m; j++)
        if (L[0][j] <= R[0][j]) {
            for (int k = L[0][j]; k <= R[0][j]; k++) cov[k] = true;
            ivs.push_back({L[0][j], R[0][j]});
        }
    int cnt = 0;
    for (int j = 0; j < m; j++) if (!cov[j]) cnt++;
    if (cnt) {
        cout << "0\n" << cnt << endl;
    } else {
        sort(ivs.begin(), ivs.end());
        int cur = -1, res = 0;
        while (cur < m - 1) {
            int mr = cur;
            for (auto iv : ivs)
                if (iv.l <= cur + 1) mr = max(mr, iv.r);
            if (mr == cur) break;
            res++;
            cur = mr;
        }
        cout << "1\n" << res << endl;
    }

    return 0;
}