社区讨论

蒟蒻求助,为什么本地能过,但是洛谷测评却WA

P1514[NOIP 2010 提高组] 引水入城参与者 8已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mi6zmm7n
此快照首次捕获于
2025/11/20 13:25
4 个月前
此快照最后确认于
2025/11/20 13:25
4 个月前
查看原帖
难道我RE了??? 请大佬们指教 代码如下: 思路就是暴力+线段覆盖 #include #include #include #include #include #include #define pa pair <int,int> using namespace std; const int N=510; const int dx[4]={0,1,0,-1}; const int dy[4]={1,0,-1,0}; int n,m,mp[N][N],ans,size,cnt; bool vis[N][N],flag=true; queue q; struct segment{ int l,r; }mem[N]; bool cmp(segment x,segment y){ return x.l<y.l; } inline void read(int &x) { x=0; char ch=getchar(); bool flag=0; while('0'>ch||ch>'9') { if(ch=='-') flag=1; ch=getchar(); } while('0'<=ch&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } if(flag) x=-x; } void bfs() { while (!q.empty()) { int x=q.front().first; int y=q.front().second; q.pop(); for (int i=0;i<=3;i++) { if (x+dx[i]>=1&&x+dx[i]<=n&&y+dy[i]>=1&&y+dy[i]<=m&&mp[x+dx[i]][y+dy[i]]<mp[x][y]&&!vis[x+dx[i]][y+dy[i]]) { vis[x+dx[i]][y+dy[i]]=1; q.push(make_pair(x+dx[i],y+dy[i])); } } } } int main() { //freopen("xxx.in","r",stdin); //freopen("xxx.out","w",stdout); read(n),read(m); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) read(mp[i][j]); for (int i=1;i<=m;i++) { q.push(make_pair(1,i)); vis[1][i]=1; } while (!q.empty()) { int x=q.front().first; int y=q.front().second; q.pop(); for (int i=0;i<=3;i++) { if (x+dx[i]>=1&&x+dx[i]<=n&&y+dy[i]>=1&&y+dy[i]<=m&&mp[x+dx[i]][y+dy[i]]<mp[x][y]&&!vis[x+dx[i]][y+dy[i]]) { vis[x+dx[i]][y+dy[i]]=1; q.push(make_pair(x+dx[i],y+dy[i])); } } } for (int i=1;i<=m;i++) { if (vis[n][i]==0) { flag=false; cnt++; } } if (flag==false) { printf("0\n"); printf("%d",cnt); return 0; } else printf("1\n"); for (int i=1;i<=m;i++) { if (i==1&&mp[1][i]>=mp[1][i+1]) { q.push(make_pair(1,i)); memset(vis,0,sizeof(vis)); vis[1][i]=true; bfs(); bool flag1=false; int l,r; for (int j=1;j<=m;j++) { if (vis[n][j]==1&&!flag1) { l=j;flag1=true; } if (vis[n][j]==1) r=j; } mem[++size].l=l; mem[size].r=r; continue; } if (i==m&&mp[1][i]>=mp[1][i-1]) { q.push(make_pair(1,i)); memset(vis,0,sizeof(vis)); vis[1][i]=true; bfs(); bool flag1=false; int l,r; for (int j=1;j<=m;j++) { if (vis[n][j]==1&&!flag1) l=j,flag1=true; if (vis[n][j]==1) r=j; } mem[++size].l=l; mem[size].r=r; continue; } if (mp[1][i]>=mp[1][i-1]&&mp[1][i]>=mp[1][i+1]) { q.push(make_pair(1,i)); memset(vis,0,sizeof(vis)); vis[1][i]=true; bfs(); bool flag1=false; int l,r; for (int j=1;j<=m;j++) { if (vis[n][j]==1&&!flag1) l=j,flag1=true; if (vis[n][j]==1) r=j; } mem[++size].l=l; mem[size].r=r; continue; } } sort(mem+1,mem+1+size,cmp); //for (int i=1;i<=size;i++) // printf("%d,%d\n",mem[i].l,mem[i].r); int last=1,far=0; for (int i=1;i<=size;i++) { if (last>=m) break; if (mem[i].l>last) { ans++; last=far; far=max(far,mem[i].r); } else far=max(far,mem[i].r); } if (last>=m) printf("%d",ans); else printf("%d",ans+1); return 0; }

回复

7 条回复,欢迎继续交流。

正在加载回复...