我们先得出一个结论:水泵要建在城市上。因为如果在非城市上建能把其他一些城市抽干,那么在城市上建也是一个效果(自己画图感性理解一下)

然后我们明白抽水的条件:周围的高度要>=自身的高度,这样会抽完它。如果低的话,会降低旁边位置的水位(这很重要)

然后我们枚举每一个城市,看它用不用建造。这样在每一个城市,枚举所有位置,看这个位置能不能被四周的抽干,这样用并查集维护,能抽干的都是一个祖先

这样枚举完一遍后,看这个城市所连的并查集有没有被抽干,如果没有,就在那里建造即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
#define pos2(i,a,b) for(int i=(a);i>=(b);i--)
#define LL long long
#define N 1010
using namespace std;
int map[N][N],n,m,cnt[N][N],ji,vis[N*N];
int fa[N*N],jicity,ans;
struct haha{
    int w,x,y;
}cun[N*N],city[N*N];
bool cmp(const haha &a,const haha &b){
     return a.w<b.w;
}
int find(int x){
    if(fa[x]!=x) fa[x]=find(fa[x]);
    return fa[x];
}
int main(){
    memset(map,0x3f,sizeof(map));
    scanf("%d%d",&n,&m);
    pos(i,1,n)
        pos(j,1,m){
            scanf("%d",&map[i][j]);
            if(map[i][j]>0){
                city[++jicity].w=map[i][j];
                city[jicity].x=i;city[jicity].y=j;
            }
            else map[i][j]=-map[i][j];
            cnt[i][j]=++ji;
            cun[ji].w=map[i][j];
            cun[ji].x=i,cun[ji].y=j;
        }
    sort(cun+1,cun+ji+1,cmp);sort(city+1,city+jicity+1,cmp);
    pos(i,1,ji) fa[i]=i;
    int j=1;
    pos(i,1,jicity){
        int cw=city[i].w,cx=city[i].x,cy=city[i].y;
        for(;j<=ji;j++){
            int w=cun[j].w,x=cun[j].x,y=cun[j].y;
            if(cw<w) break;
            if(map[x][y]>=map[x+1][y]){
                vis[find(cnt[x][y])]|=vis[find(cnt[x+1][y])];
                fa[find(cnt[x+1][y])]=find(cnt[x][y]);
            }
            if(map[x][y]>=map[x][y+1]){
                vis[find(cnt[x][y])]|=vis[find(cnt[x][y+1])];
                fa[find(cnt[x][y+1])]=find(cnt[x][y]);
            }
            if(map[x][y]>=map[x-1][y]){
                vis[find(cnt[x][y])]|=vis[find(cnt[x-1][y])];
                fa[find(cnt[x-1][y])]=find(cnt[x][y]);
            }
            if(map[x][y]>=map[x][y-1]){
                vis[find(cnt[x][y])]|=vis[find(cnt[x][y-1])];
                fa[find(cnt[x][y-1])]=find(cnt[x][y]);
            }
        }
        if(!vis[find(cnt[cx][cy])]){
            ans++;vis[find(cnt[cx][cy])]=1;
        }
    }
    cout<<ans;
    return 0;
}

  

[POI2007]洪水pow 并查集的更多相关文章

  1. [POI2007]洪水pow 题解

    [POI2007]洪水pow 时间限制: 5 Sec  内存限制: 128 MB 题目描述 AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD ...

  2. 洛谷P3457 [POI2007]POW-The Flood [并查集,模拟]

    题目传送门 pow 题意翻译 Description 你手头有一张该市的地图.这张地图是边长为 m∗n 的矩形,被划分为m∗n个1∗1的小正方形.对于每个小正方形,地图上已经标注了它的海拔高度以及它是 ...

  3. bzoj1104: [POI2007]洪水pow

    #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #i ...

  4. [POI2007]洪水pow

    Description AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD市的市长,召集了他的所有顾问(包括你)参加一个紧急会议.经过细致的商 ...

  5. 【BZOJ】1104: [POI2007]洪水pow

    题意 给一个\(n * m(1 \le n, m \le 1000)\)的矩阵,如果\(a_{i, j}\)为正表示城市.\(|a_{i, j}|(|a_{i, j}| \le 1000)\)是格子\ ...

  6. [POI2007]洪水pow bfs

    发现:只在所有自己的城市建水泵一定是最优解. 所以对自己的城市按高度排序,该城市不用建的前提是从他出发经过一条高度都小于等于他的路径能到达一个已经修建水泵的 sort+bfs...... #inclu ...

  7. 并查集 - BZOJ 1104 [POI2007]洪水

    BZOJ 1104 [POI2007]洪水 描述 AKD 市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD 市全被水淹没了.Blue Mary,AKD 市的市长,召集了他的所有顾问(包括你 ...

  8. BZOJ 1098 [POI2007]办公楼biu(反向图bfs+并查集优化)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1098 [题目大意] 现在有一张图,要求将这张图的点划分为尽量多的分组,对于不同分组的两 ...

  9. poj2236(并查集)

    题目链接: http://poj.org/problem?id=2236 题意: 有n台计算机, 已知每台计算机的坐标, 初始时所有计算机都是坏的, 然后修复其中一些计算机, 已修复的计算机距离不超过 ...

随机推荐

  1. Log4Net不同日志类型写入到不同文件

    1. 一直在用log4net,从来没有自己整理过.实践出真知,只有自己整理过才能真正掌握. 2. log4net,应该读logfornet,以前一直说log4,log4............ 安装 ...

  2. selenium 环境搭建

    使用selenium + python来搭建环境的步骤: 1. 下载 python 的版本,常用到的有 2.7 和 3.6 2. 下载 selenium 的版本,通过命令进行下载. pip insta ...

  3. CSS 基础

    CSS Cascading Style Sheet 层叠样式表 Css创建: 1.外部样式表(样式表应该以 .css 扩展名进行保存) <head> <link rel=" ...

  4. python2和python3中的类

    经典类与新式类 例如: A B C D 四个类 D 包含 BC :   B和C分别包含A py2 在经典类中是按深度优先来继承 例如: D中查找B,B没有从A中查找 新式类中是按广度优先来查找继承的 ...

  5. Educational Codeforces Round 23.C

    C. Really Big Numbers time limit per test 1 second memory limit per test 256 megabytes input standar ...

  6. python机器学习实战(一)

    python机器学习实战(一) 版权声明:本文为博主原创文章,转载请指明转载地址 www.cnblogs.com/fydeblog/p/7140974.html  前言 这篇notebook是关于机器 ...

  7. Unity3D 物体移动到指定点

    transform.position=Vector3.MoveTowards(transform.position , Target.position, speed * Time.deltaTime) ...

  8. Java负载均衡-輪詢法

    import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Set; /* ...

  9. 全网首创ISE入门级教程

    转眼间我已经大三了,现在成为了实验室的负责人,对于下一届学生的纳新重任就交到了我的手上,想采取不同的方法暑假尽可能对他们进行一些培训,所以制作了此教程,说实话,在网上还没有找到关于ISE的入门级使用教 ...

  10. 解决React Native unable to load script from assets index.android.bundle on windows

    React Native运行的时候,经常碰到React Native unable to load script from assets index.android.bundle on windows ...