记录编号 605059 评测结果 AAAAAAAAAA
题目名称 521.[NOIP 2010]引水入城 最终得分 100
用户昵称 Gravatar我也不知道 是否通过 通过
代码语言 C++ 运行时间 0.280 s
提交时间 2025-08-13 15:24:39 内存使用 6.65 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
int n,m,h[501][501];
int ans=0;
int r[501][501]={0},l[501][501];
bool visit1[501][501]= {0};
int dfs(int x,int y) {
	int x1[4]= {0,0,-1,1},y1[4]= {-1,1,0,0};
	visit1[x][y]=1;
	for(int i=0; i<4; i++) {
		int xx=x+x1[i],yy=y+y1[i];
		if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&h[xx][yy]<h[x][y]) {
			if(!visit1[xx][yy])	dfs(xx,yy);
			r[x][y]=max(r[x][y],r[xx][yy]);
			l[x][y]=min(l[x][y],l[xx][yy]);
		}
	}
	return 0;
}
int main() {
	freopen("flow.in", "r", stdin);
	freopen("flow.out", "w", stdout);
	cin >> n >>m;
	memset(l,600,sizeof(l));
	memset(r,0,sizeof(r));
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++){
         cin>>h[i][j];
         if(i==n)l[i][j]=r[i][j]=j;
     }
	}
	int L=1;
	for(int i=1; i<=m; i++) {
		if(!visit1[1][i]) dfs(1,i);
	}
	int R=0,Q=0;
	for(int i=1; i<=m; i++) {
		if(!visit1[n][i]) Q++;
	}
	if(Q) {
			cout<<0<<endl<<Q;
		return 0;
	}

	while(L<=m) {
		for(int i=1; i<=m; i++) {
			if(l[1][i]<=L) {
				R=max(R,r[1][i]);
			}
		}

		L=R+1;
		ans++;
	}
	cout<<1<<endl<<ans;
	return 0;
}