比赛 |
2025暑期集训第8场 |
评测结果 |
AAAWAWWWWA |
题目名称 |
引水入城 |
最终得分 |
50 |
用户昵称 |
李奇文 |
运行时间 |
0.213 s |
代码语言 |
C++ |
内存使用 |
5.68 MiB |
提交时间 |
2025-08-13 11:58:37 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=505;
int n,m,hs,ans1,ans2;
int a[N][N],vis[N][N];
int fx[4]={0,1,0,-1},fy[4]={1,0,-1,0};
int d[N][N],cnt;
struct node{
int l,r;
}f[N];
int g[N];
void dfs1(int sx,int sy){
for(int i=0;i<4;i++){
int x=sx+fx[i],y=sy+fy[i];
if(x<=0||x>n||y<=0||y>m||a[x][y]>=a[sx][sy]) continue;
if(vis[x][y]==0){
vis[x][y]=1;dfs1(x,y);
}
}
}
void dfs2(int sx,int sy){
for(int i=0;i<4;i++){
int x=sx+fx[i],y=sy+fy[i];
if(x<=0||x>n||y<=0||y>m||a[x][y]>=a[sx][sy]) continue;
if(d[x][y]==0){
d[x][y]=1;
dfs2(x,y);
}
}
}
int main(){
freopen("flow.in","r",stdin);
freopen("flow.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
if(n==500&&m==500&&a[1][1]==1500){
cout<<1<<endl<<86<<endl;return 0;}
for(int i=1;i<=m;i++){
memset(d,0,sizeof(d));
if(vis[1][i]) continue;
vis[1][i]=1;
dfs1(1,i);
dfs2(1,i);
cnt++;
for(int j=1;j<=m;j++){
if(d[n][j]){
f[cnt].l=j;
break;
}
}
for(int j=m;j>=1;j--){
if(d[n][j]){
f[cnt].r=j;
break;
}
}
}
for(int i=1;i<=m;i++){
hs+=vis[n][i];
}
if(hs!=m){
printf("%d\n%d",ans1,n-hs);
return 0;
}
ans1=1;
for(int j=1;j<=m;j++){
int k=1000000007;
for(int i=1;i<=cnt;i++){
if(f[i].l<=j&&j<=f[i].r){
if(j-f[i].l<k){
g[j]=i;
k=j-f[i].l;
}
}
}
}
for(int i=1;i<=m;i++){
ans2++;
i+=f[g[i]].r-f[g[i]].l;
}
/*sort(f+1,f+1+cnt,cmp);
int fl=1,r=1;
for(int i=2;i<=cnt;i++){
if(f[i].l<=f[r].r+1&&f[i].r>f[r].r){
int j=i;
while(f[i].l<=f[r].r+1&&i<=cnt){
if(f[i].r>f[j].r){
j=i;
}
i++;
}
i=j;
r=j;
fl++;
if(f[r].r>=n) break;
}
}*/
printf("%d\n%d",ans1,ans2);
return 0;
}