[POI2007]POW-The Flood

Description

AKD 市处在一个四面环山的谷地里。最近一场大暴雨引发了洪水,AKD 市全被水淹没了。Blue Mary,AKD 市的市长,召集了他的所有顾问(包括你)参加一

个紧急会议。经过细致的商议之后,会议决定,调集若干巨型抽水机,将它们放

在某些被水淹的区域,而后抽干洪水。

你手头有一张 AKD 市的地图。这张地图是边长为 mn 的矩形,被划分为 mn个 11 的小正方形。对于每个小正方形,地图上已经标注了它的海拔高度以及它是否是 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

考试的时候推样例都推了很久,有巨佬居然瞎xx乱搞拿了40???Orz

一个很重要的结论:我们要在所有“山谷”放抽水机。所以我们把每个点的海拔从小到大排序 ,对于每一个点,把它和周围比它低的点并入一个集合,因为比它低的点水排走了,它的水也就排走了,所以这个集合里最小的点放上了抽水机,就一定能保证这个集合的水全部被排走。

所以对于每一组海拔相同的点,如果它加入的集合中有城市但是没有放抽水机,就需要放抽水机。显然再往后海拔变高不可能在把它排空。

还有一个细节:将同一高度的格子合并完后再放置抽水机。显然两个格子3 4 3是可以在一个集合的,所以我们不要边合并边判断要不要放抽水机。

sb错误:排序后没有记录原位置,导致处理出错

#include<bits/stdc++.h>
using namespace std;
int read()
{
int x=0,w=1;char ch=getchar();
while(ch>'9'||ch<'0') {if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*w;
}
int m,n,cnt,last,ans;
bool fang[2000010];
int a[1010][1010],fa[2000010];
struct node{
int x,y,v,cnt;
}f[2000010];
bool cmp(node p,node q){return p.v<q.v;}
int gfa(int x){if(x==fa[x])return x;return fa[x]=gfa(fa[x]);}
void change(int k)
{
for(int i=last;i<=k;i++)
{
int ff=gfa(f[i].cnt);
if(!fang[ff]&&a[f[i].x][f[i].y]>0) ans++,fang[ff]=1;
}
}
void hebing(int x,int y)
{
int xx=gfa(x),yy=gfa(y);
if(xx==yy) return;
fa[yy]=xx;fang[xx]|=fang[yy];
}
int main()
{
n=read();m=read();memset(a,127,sizeof(a));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
a[i][j]=read();
cnt++;f[cnt].x=i;f[cnt].y=j;f[cnt].v=abs(a[i][j]);fa[cnt]=cnt;f[cnt].cnt=cnt;
}
}
sort(f+1,f+1+cnt,cmp);last=1;f[0].v=0x7fffffff;
for(int i=1;i<=cnt;i++)
{
if(f[i].v!=f[i-1].v&&i!=1) {change(i-1);last=i;}
int x=f[i].x,y=f[i].y;
if(f[i].v>=abs(a[x-1][y])) hebing(f[i].cnt,(x-2)*m+y);
if(f[i].v>=abs(a[x+1][y])) hebing(f[i].cnt,x*m+y);
if(f[i].v>=abs(a[x][y-1])) hebing(f[i].cnt,(x-1)*m+y-1);
if(f[i].v>=abs(a[x][y+1])) hebing(f[i].cnt,(x-1)*m+y+1);
}change(f[cnt].cnt);
cout<<ans;
}

[POI2007]POW-The Flood(并查集)的更多相关文章

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

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

  2. [POI2007]洪水pow 并查集

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

  3. 【Luogu3457】POW-The Flood(并查集)

    [Luogu3457]POW-The Flood(并查集) 题面 洛谷 题解 我们知道,如果一个点和一个海拔不高于它的点相连 那么连在那个点是更优的,所以考虑按照每个点的海拔排序 既然按照海拔排序,相 ...

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

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

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

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

  6. poj2236(并查集)

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

  7. POJ 2236 Wireless Network (并查集)

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 18066   Accepted: 761 ...

  8. [POJ 2588]--Snakes(并查集)

    题目链接:http://poj.org/problem?id=2588 Snakes Time Limit: 1000MS   Memory Limit: 65536K   Description B ...

  9. BZOJ 2303: [Apio2011]方格染色 [并查集 数学!]

    题意: $n*m:n,m \le 10^6$的网格,每个$2 \times 2$的方格必须有1个或3个涂成红色,其余涂成蓝色 有一些方格已经有颜色 求方案数 太神了!!!花我三节课 首先想了一下只有两 ...

  10. Codeforces445B(SummerTrainingDay06-N 并查集)

    B. DZY Loves Chemistry time limit per test:1 second memory limit per test:256 megabytes input:standa ...

随机推荐

  1. Redis高可用分布式

    阅读目录: 高可用 数据同步 分布式 分布式集群时代 总结 高可用 高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响. 停止服务的原因可能由于网卡.路由器 ...

  2. Spring Cloud教程(十)自定义引导配置属性源

    可以通过在org.springframework.cloud.bootstrap.BootstrapConfiguration键下添加条目/META-INF/spring.factories来训练引导 ...

  3. matlab 中 ordfilt2() 函数

    简介: ordfilt2 是一个二维数据过滤器,首先对根据滤窗口中的非零元素对目标矩阵中的元素进行排序,然后用其中第K(通过参数指定)大的元素代替原数据值,并以此过程遍历目标矩阵中的每一个元素. 一. ...

  4. 深入探究JVM(2) - 探秘Metaspace

    Java 8彻底将永久代移除出了HotSpot JVM,将其原有的数据迁移至Java Heap或Metaspace.这一篇文章我们来总结一下Metaspace(元空间)的特性.如有错误,敬请指出,谢谢 ...

  5. db2用户权限赋值

    <!------------创建db2用户和组-------------------------------------------> [root@localhost ~]# userad ...

  6. SSH 连接慢 等好久

    SSH连接慢,要等好久好久,有时出现输入密码提示符,输入密码回车立即就超时了. ssh -v xxx.xxx.xxx.xxx   看到是GSS的问题. 解决办法,在两边SSH上配置,UseDNS如果被 ...

  7. EnumMap 源码分析

    EnumMap EnumMap 能解决什么问题?什么时候使用 EnumMap? 1)EnumMap[枚举映射]中的键值必须来自单个枚举. 2)EnumMap 根据枚举键的自然顺序来维护,迭代遍历是有序 ...

  8. 测开之路一百零二:jquery元素操作

    jquery对元素操作,获取/替换文本(.text()).html(.html()).属性(.attr()).值(.val()) html代码 text() 根据标签获取文本值 同一个标签下筛选明细 ...

  9. TensorFlow学习笔记9-深度模型的优化

    深度模型的优化 回顾概念: 代价函数时训练集上损失函数的平均: \[J(\theta)=E_{(x,y)\sim \hat{p}_{data}}L(f(x;\theta),y) \tag{1}\] 引 ...

  10. 宝塔 windows下apache环境下禁止某文件夹内运行PHP脚本、禁止访问文件

    首先我们来看两段对上传目录设置无权限的列子,配置如下: //在宝塔下如用/upload这个路径应用无效,一定要C:/wwwroot/upload才有效果 <Directory "要去掉 ...