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

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

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

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

#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. Administrator账户密码忘了怎么办

    WIN7的Administrator账户密码忘了怎么办   1.准备一个带有winpe系统的系统光盘或者U盘 2.启动电脑,按F12选择U盘或者光盘启动,进入winpe操作系统 3.找到c:\wind ...

  2. [leetcode-474-Ones and Zeroes]

    In the computer world, use restricted resource you have to generate maximum benefit is what we alway ...

  3. 【LeetCode】89. Gray Code

    题目: The gray code is a binary numeral system where two successive values differ in only one bit. Giv ...

  4. cssradius

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. 10.application对象

    1.application对象实现了用户数据的共享,可存放全局变量 2.application开始于服务器的启动,终止于服务器的关闭. 3.在用户的前后连接或不同用户之间的连接中,可以对applica ...

  6. SharePoint 2013 安装

    步骤 1:打开提升的 SharePoint 2013 命令行管理程序 选择与您的服务器操作系统对应的过程. 在 Windows Server 2008 R2 中 单击“开始”>“所有程序”> ...

  7. 4个小时实现一个HTML5音乐播放器

    技术点:ES6+Webpack+HTML5 Audio+Sass 这里,我们将一步步的学到如何从零去实现一个H5音乐播放器. 首先来看一下最终的实现效果:Demo链接 接下来就步入正题: 要做一个音乐 ...

  8. usaco 2008 月赛 lites 开关灯 题解

      题目:     Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是 牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每一 ...

  9. JAVA - 深入JAVA 虚拟机 3

    类的初始化时机 package practise; class Parent{ static int a =3; static{ System.out.println("Parent sta ...

  10. pc端的企业网站(IT修真院test8)详解1-1

    这任务需求我们使用推特的前端框架bootstrap来实现.先放psd图. 上传这些图片也蛮大的.为此我使用office picture manager压缩了图片. 方法:alt+p+o,然后tab+下 ...