比赛 2025暑期集训第8场 评测结果 AAAAAAAAAA
题目名称 引水入城 最终得分 100
用户昵称 Hollow07 运行时间 0.963 s
代码语言 C++ 内存使用 4.85 MiB
提交时间 2025-08-13 10:21:12
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long

struct node{
	ll x,y,h;
};

vector<ll> water[510];
ll mp[510][510],n,m,last[510];
bool vis[510][510],flag[510];
ll ans,ans2,maxn,maxm;
bool check=1;

queue<node> q;

void bfs(ll x){
	memset(vis,0,sizeof(vis));
	q.push({1,x,mp[1][x]});
	while(!q.empty()){
		ll nx=q.front().x,ny=q.front().y,nh=q.front().h;
		q.pop();
        if(vis[nx][ny]) continue;
		vis[nx][ny]=1;
		if(nx==n) water[ny].push_back(x);
		if(nx+1<=n&&mp[nx+1][ny]<nh){
			q.push({nx+1,ny,mp[nx+1][ny]});
		}if(ny+1<=m&&mp[nx][ny+1]<nh){
			q.push({nx,ny+1,mp[nx][ny+1]});
		}if(nx-1>=1&&mp[nx-1][ny]<nh){
			q.push({nx-1,ny,mp[nx-1][ny]});
		}if(ny-1>=1&&mp[nx][ny-1]<nh){
			q.push({nx,ny-1,mp[nx][ny-1]});
		}
	}
}

int main(){
//	freopen("in.in","r",stdin);
	freopen("flow.in","r",stdin);
	freopen("flow.out","w",stdout);
	scanf("%lld %lld",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("%lld",&mp[i][j]);
		}
	}
	for(int i=1;i<=m;i++) bfs(i);
	for(int i=1;i<=m;i++){
		if(!water[i].size()){
			check=0;
			ans2++;
		}
	}
	if(!check){
		printf("0\n%lld",ans2);
		return 0;
	}
	for(int i=1;i<=m;i++){
		for(int j=0;j<water[i].size();j++){
			last[water[i][j]]=i;
		}
	}
	for(int i=1;i<=m;i++){
		bool flag2=0;
		for(int j=0;j<water[i].size();j++){
			if(flag[water[i][j]]==1){
				flag2=1;
				break;
			}
		}
		if(flag2==0){
			maxn=0;maxm=0;ans++;
			for(int j=0;j<water[i].size();j++){
				if(last[water[i][j]]>maxn){
					maxn=last[water[i][j]];
					maxm=j;
				}
			}
			flag[water[i][maxm]]=1;
		}
	}
	printf("1\n%lld",ans);
	return 0;
}