记录编号 605025 评测结果 AAAAAAAAAA
题目名称 521.[NOIP 2010]引水入城 最终得分 100
用户昵称 Gravatar彭欣越 是否通过 通过
代码语言 C++ 运行时间 1.119 s
提交时间 2025-08-13 14:39:26 内存使用 5.03 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=510;
int dx[]={0,-1,1,0},dy[]={1,0,0,-1};
int n,m,sum,a[N][N],vis[N][N],mk[N];
struct node {
	int x,y;
};
struct edge {
	int l,r;
}s[N];
bool cmp (edge x,edge y) {
	return x.r>y.r;
}
queue<node>q;
void bfs (int x,int y,int k) {
	if (x==n) {
		mk[y]=1;
		s[y].l=y;
		s[y].r=y;
	}
	memset(vis,0,sizeof(vis));
	q.push((node){x,y});
	vis[x][y]=1;
	while (!q.empty()) {
		int x=q.front().x;
		int y=q.front().y;
		q.pop();
		for (int i=0;i<4;i++) {
			int xx=x+dx[i],yy=y+dy[i];
			if (xx<1||yy<1||xx>n||yy>m||a[xx][yy]>=a[x][y]||vis[xx][yy]) continue;
			if (xx==n) {
				mk[yy]=1;
				if (s[k].l==0) s[k].l=yy;
				else s[k].l=min(s[k].l,yy);
				s[k].r=max(s[k].r,yy);
			}
			vis[xx][yy]=1;
			q.push((node){xx,yy});
		}
	}	
}
void dfs (int idx) {
	//cout << idx <<endl;
	if (idx==m) return;
	for (int i=1;i<=m;i++) {
		if (s[i].l==0&&s[i].r==0) continue;
		if (s[i].l<=idx+1) {
			sum++;
	        dfs(s[i].r);
	        return;
		}
	}
}
int main () {
	freopen("flow.in","r",stdin);
	freopen("flow.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin >> n >> m;
    //memset(l,0x3f,sizeof(l));
	//for (int i=1;i<=100000;i++) f[i]=i;
	for (int i=1;i<=n;i++) {
		for (int j=1;j<=m;j++) {
			cin >> a[i][j];
		}
	}
	for (int i=1;i<=m;i++) bfs(1,i,i);
	//int sum=0;
	for (int i=1;i<=m;i++) if (mk[i]==0) sum++;
	if (sum>0) {
		cout << 0 <<endl;
		cout << sum <<endl;
		return 0;
	}
	cout << 1 <<endl;
    sort(s+1,s+1+m,cmp);
    //for (int i=1;i<=m;i++) cout << s[i].l <<' '<< s[i].r <<endl;
	dfs(1);
	cout << sum <<endl;
	return 0;
}