Description

AKD市处在一个四面环山的谷地里。最近一场大暴雨引发了洪水,AKD市全被水淹没了。Blue Mary,AKD市的市长,召集了他的所有顾问(包括你)参加一个紧急会议。经过细致的商议之后,会议决定,调集若干巨型抽水机,将它们放在某些被水淹的区域,而后抽干洪水。 
你手头有一张AKD市的地图。这张地图是边长为m*n的矩形,被划分为m*n个1*1的小正方形。对于每个小正方形,地图上已经标注了它的海拔高度以及它是否是AKD市的一个组成部分。地图上的所有部分都被水淹没了。并且,由于这张地图描绘的地面周围都被高山所环绕,洪水不可能自动向外排出。显然,我们没有必要抽干那些非AKD市的区域。 
每个巨型抽水机可以被放在任何一个1*1正方形上。这些巨型抽水机将持续地抽水直到这个正方形区域里的水被彻底抽干为止。当然,由连通器原理,所有能向这个格子溢水的格子要么被抽干,要么水位被降低。每个格子能够向相邻的格子溢水,“相邻的”是指(在同一高度水平面上的射影)有公共边。

Input

第一行是两个数m,n(1<=m,n<=1000). 
以下m行,每行n个数,其绝对值表示相应格子的海拔高度;若该数为正,表示他是AKD市的一个区域;否则就不是。 
请大家注意:所有格子的海拔高度其绝对值不超过1000,且可以为零.

Output

只有一行,包含一个整数,表示至少需要放置的巨型抽水机数目。

 

Sample Input

6 9
-2 -2 -1 -1 -2 -2 -2 -12 -3
-2 1 -1 2 -8 -12 2 -12 -12
-5 3 1 1 -12 4 -6 2 -2
-5 -2 -2 2 -12 -3 4 -3 -1
-5 -6 -2 2 -12 5 6 2 -1
-4 -8 -8 -10 -12 -8 -6 -6 -4
 
 

Sample Output

2

Hint

题解:

结论:若在I放置一个抽水机,且J与I之间存在一条路径使得max(H)<=H[j],那么J的水可以被抽干。所以显然我们要在所有“山谷”放抽水机。

将格子按高度从小到大加入,加入I时将其与相邻的格子并入一个集合,若I需要抽水且合并后I属于的集合没有抽水机则在I处放置一个抽水机。

细节:将同一高度的格子合并完后再放置抽水机。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
int n,m,tot,ans,last=;
int map[],h[],b[],vis[],t[]={-,,,,-},p[],father[];
int gi()
{
int ans=,f=;
char i=getchar();
while(i<''||i>''){if(i=='-')f=-;i=getchar();}
while(i>=''&&i<=''){ans=ans*+i-'';i=getchar();}
return ans*f;
}
int make(int x,int y)
{
return (x-)*m+y;
}
bool cmp(int a,int b)
{
return h[a]<h[b];
}
int find(int x)
{
if(father[x]==x)return x;
else return father[x]=find(father[x]);
}
int main()
{
int i,j;
n=gi();m=gi();
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
int x=make(i,j);
h[x]=gi();
father[x]=x;
map[++tot]=x;
if(h[x]>)b[x]=;
else h[x]=-h[x];
}
}
sort(map+,map+tot+,cmp);
for(i=;i<=tot;i++)
{
int a=map[i],y=(a-)%m+,x=(a-)/m+;
for(j=;j<;j++)
{
int xx=x+t[j],yy=y+t[j+];
if(xx>=&&xx<=n&&yy>=&&yy<=m)
{
int b=make(xx,yy);
if(vis[b])
{
int fa=find(b);
p[a]|=p[fa];
father[fa]=find(a);
}
}
}
vis[a]=;
if(h[map[i]]!=h[map[i+]])
{
for(j=last;j<=i;j++)
{
if(b[map[j]]&&!p[find(map[j])])
{
ans++;
p[find(map[j])]=;
}
}
last=i+;
}
}
printf("%d\n",ans);
return ;
}

洪水 Pow的更多相关文章

  1. [POI2007]洪水pow 题解

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

  2. [POI2007]洪水pow

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

  3. bzoj1104: [POI2007]洪水pow

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

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

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

  5. [POI2007]洪水pow 并查集

    我们先得出一个结论:水泵要建在城市上.因为如果在非城市上建能把其他一些城市抽干,那么在城市上建也是一个效果(自己画图感性理解一下) 然后我们明白抽水的条件:周围的高度要>=自身的高度,这样会抽完 ...

  6. [POI2007]洪水pow bfs

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

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. 【探索】无形验证码 —— PoW 算力验证

    先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...

  9. [LeetCode] Super Pow 超级次方

    Your task is to calculate ab mod 1337 where a is a positive integer and b is an extremely large posi ...

随机推荐

  1. suse enterprise Linux 11上配置 oracle11g和tomcat开机自启动

    一.oracle 11g r2自启动 1.修改/etc/sysconfig/oracle文件: ORACLE_BASE=/oracle  //此处改为你安装的oracle目录 START_ORACLE ...

  2. redis设置密码和redis主从复制

    redis设置密码和redis主从复制 一.redis设置密码 1.Redis实用特性 安全性  主从复制(侦听器)事务处理 持久化机制 发布订阅消息 2.安全性:设置客户端连接后进行任何其他指定前需 ...

  3. 基于django封装的常用装饰器和函数

    1:返回操作成功的json数据 def response_success(message, data=None, data_list=[]): return HttpResponse(json.dum ...

  4. CF285 E Positions in Permutations——“恰好->大于”的容斥和允许“随意放”的dp

    题目:http://codeforces.com/contest/285/problem/E 是2018.7.31的一场考试的题,当时没做出来. 题解:http://www.cnblogs.com/y ...

  5. 数据字典生成工具(生成Excel, Word,PDF,html)

    转自:http://www.cnblogs.com/yanweidie/p/3838765.html 数据字典生成工具之旅系列文章导航 数据字典生成工具之旅系列文章导航 宣传语 数据字典生成工具.数据 ...

  6. URL shortening service

    Use Cases 1, shortening : take a URL => return a much shorter URL 2, redirection : take a short U ...

  7. mysql 1069 数据库无法启动解决办法

    mysql无缘无故的启动不了了. 在控制台里面用root连接,报错10061. 在服务管理里面启动,报错1069. 在网上找了一些解决方法,删除my.ini之类的,都无效.后来在百度经验里面找到了可行 ...

  8. Centos7 安装vim8

    一.卸载旧版本的vim yum -y remove vim* 二.安装终端字符处理库ncurses yum -y install ncurses-devel 三.下载Vim8 wget https:/ ...

  9. hdu 4336 Card Collector (概率dp+位运算 求期望)

    题目链接 Card Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  10. ACM-ICPC2018南京网络赛 AC Challenge(一维状压dp)

    AC Challenge 30.04% 1000ms 128536K   Dlsj is competing in a contest with n (0 < n \le 20)n(0<n ...