30 pts 求条
查看原帖
30 pts 求条
1161545
_XSOI_楼主2024/7/12 14:35

大佬救我

悬关

#include <iostream>
#include <cmath>
#include <cstring>
#define re return
#define mem memset
using namespace std;
const int MAXX = 500 + 11;
const int inf = 2147483647;
int map[MAXX][MAXX];
int xx[4] = {-1,0,1,0},yy[4] = {0,1,0,-1};
int vis[MAXX][MAXX];
int l[MAXX][MAXX],r[MAXX][MAXX]; // 区间
int n,m;
void dfs(int x,int y) {
	vis[x][y] = 1;
	for (int i = 0; i < 4; i ++) {
		int nx = x + xx[i];
		int ny = y + yy[i];
		if (nx >= 1 and nx <= n and ny >= 1 and ny <= m) {// 越界
			if (!vis[nx][ny] and map[nx][ny] < map[x][y]) {
				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() {
	cin >> n >> m;
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= m; j ++) {
			scanf("%d",&map[i][j]);
		}
	}
	mem(l,inf,sizeof(l));
	for (int i = 1; i <= m; i ++) {
		l[n][i] = r[n][i] = i; // 初始状态
	}
	for (int i = 1; i <= m; i ++) {
		if (!vis[1][i]) {
			dfs(1,i);
		}
	}
	bool flag = 0;
	int sum = 0;
	for (int i = 1; i <= m; i ++) {
		if (!vis[n][i]) { // 不可以!
			flag = 1;
			sum ++;
		}
	}
	if (flag) {
		puts("0");
		cout << sum << endl;
		re 0;
	}
	int L = 1;
	while (L <= m) {
		int R = 0;
		for (int i = 1; i <= m; i ++) {
			if (l[1][i] <= L) {
				R = max(R,r[1][i]);
			}
		}
		sum ++;
		L = R + 1;
	}
	puts("1");
	cout << sum << endl;
	re 0;
}
2024/7/12 14:35
加载中...