求评马蜂
  • 板块灌水区
  • 楼主Candsy_bnt
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/10/20 11:27
  • 上次更新2024/10/20 12:54:54
查看原帖
求评马蜂
762100
Candsy_bnt楼主2024/10/20 11:27

#include <bits/stdc++.h>

using namespace std;

int n, m;
int a[510][510], cnt, l[510][510], r[510][510];
bool b[510][510], flg;
vector<pair<int, int>> v{{-1, 0}, {0, -1}, {1, 0}, {0, 1}};

inline void dfs(int x, int y) {
	b[x][y] = true;
	for (auto i : v) {
		int nx = x + i.first, ny = y + i.second;
		if (nx < 1 || ny < 1 || ny > m || nx > n)
			continue;
		if (a[nx][ny] >= a[x][y])
			continue;
		if (!b[nx][ny])
			dfs(nx, ny);
        l[x][y] = min(l[x][y], l[nx][ny]);
        r[x][y] = max(r[x][y], r[nx][ny]);
	}
}

int main() {
	freopen("NtoS.in", "r", stdin);
	freopen("NtoS.out", "w", stdout);
	scanf("%d%d", &n, &m);
	memset(l, 0x3f, sizeof(l));
    memset(r, 0, sizeof(r));
    for (int i = 1; i <= m; i++)
        l[n][i] = r[n][i] = i;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			scanf("%d", &a[i][j]);
	for (int i = 1; i <= m; i++)
		if (!b[1][i])
			dfs(1, i);
	for (int i = 1; i <= m; i++)
		if (!b[n][i])
			flg = true, cnt++;
	if (flg) {
		printf("0\n%d", cnt);
		return 0;
	}
    int lt = 1;
    while (lt <= m) {
        int maxr = 0;
        for (int i = 1; i <= m; i++)
            if (l[1][i] <= lt)
                maxr = max(maxr, r[1][i]);
        cnt++;
        lt = maxr + 1;
    }
	printf("1\n");
    printf("%d", cnt);
    return 0;
}

2024/10/20 11:27
加载中...