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

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

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

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

#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. juggle添加c#版本

    此前做过一个c++版的网络层dsl:http://www.cnblogs.com/qianqians/p/4255034.html 现在给这个dsl加入c#的支持,并且对代码的结构做了优化,将语法解析 ...

  2. JAVA基础——类和对象

    java类与对象学习笔记 一.成员变量和局部变量 (1)定义 1.成员变量 在类中定义,用来描述对象将要有什么.(默认的成员变量值为0) 2.局部变量 在类的方法中定义,在方法中临时保存数据. 演示示 ...

  3. springmvc常用注解标签详解【转】

    转载自:http://www.cnblogs.com/leskang/p/5445698.html 1.@Controller 在SpringMVC 中,控制器Controller 负责处理由Disp ...

  4. docker中执行sed: can't move '/etc/resolv.conf73UqmG' to '/etc/resolv.conf': Device or resource busy错误的处理原因及方式

    错误现象 在docker容器中想要修改/etc/resolv.conf中的namesever,使用sed命令进行执行时遇到错误: / # sed -i 's/192.168.1.1/192.168.1 ...

  5. angular.extend、angular.$watch、angular.bootstrap

    1.angular.extend:依次将第二个参数及后续的参数的第一层属性(不管是简单属性还是对象)拷贝给第一个参数的第一层属性,即如果是对象,则是引用的是同一个对象,并返回第一个参数对象. 直接上代 ...

  6. mysql中的limit

    mysql中常使用limit做分页查询,使用方法也很简单: SELECT * FROM table LIMIT [offset,] rows #注: offset-偏移量,rows查询返回的行数 -- ...

  7. VB6之借助zlib实现gzip解压缩

    这是个简版的,可以拿来做下网页gzip的解压缩,整好我的webserver还不支持这个,有时间了就加上. zlib.dll下载请点击我! 模块zlib.bas的代码如下: 'code by lichm ...

  8. AddNewsServlet -servlet处理响应请求

    package com.pb.news.web.servlet; import java.io.File;import java.io.IOException;import java.util.Dat ...

  9. 详解Linux chgrp和chown命令的用法

    Linux chgrp和chown命令是管理员的常用命令,对于初学Linux系统管理的人来说,这对Linux chgrp和chown命令具体的用法这里做一介绍. Linux chgrp命令 功能:改变 ...

  10. Spring DelegatingFilterProxy解析

    以前DelegatingFilterProxy是在需要使用spring security 的时候在xml中配置,如下: <filter> <filter-name>spring ...