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

题面

洛谷

题解

我们知道,如果一个点和一个海拔不高于它的点相连

那么连在那个点是更优的,所以考虑按照每个点的海拔排序

既然按照海拔排序,相邻的海拔递增的点可以放在同一个集合里面讨论

考虑使用并查集,每一个集合中只需要有一个抽水机即可

每次从海拔最低的点中选出一个点

将它和它周围的海拔比当前海拔低的点直接链接在一起

同时,维护每个并查集是否存在抽水机

如果当前点是城市,并且所在的并查集中有抽水机了

显然是不用再额外增加抽水机了

但是,如果当前点和周围的点合并完之后,所在集合依然没有抽水机

因为它所在的集合周围的点海拔一定更高,不可能有抽水机

所以在当前集合中一点要放一个抽水机,

那么,给当前集合放一个抽水机,同时答案加一即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 1010
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,m,g[MAX][MAX],bh[MAX][MAX];
struct Node{int id,x,y,w;}p[MAX*MAX];
bool operator<(Node a,Node b){return a.w<b.w;}
int f[MAX*MAX],pl[MAX*MAX],tot,ans;
int getf(int x){return x==f[x]?x:f[x]=getf(f[x]);}
int d[4][2]={1,0,-1,0,0,1,0,-1};
void Merge(int u,int v)
{
pl[getf(v)]|=pl[getf(u)];
f[getf(u)]=getf(v);
}
int main()
{
freopen("pow.in","r",stdin);
freopen("pow.out","w",stdout);
n=read();m=read();
memset(g,-63,sizeof(g));
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
g[i][j]=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
p[++tot]=(Node){bh[i][j]=tot,i,j,abs(g[i][j])};
for(int i=1;i<=tot;++i)f[i]=i;
sort(&p[1],&p[tot+1]);
for(int i=1;i<=tot;++i)
{
int X=p[i].x,Y=p[i].y;
for(int k=0;k<4;++k)
{
int x=p[i].x+d[k][0],y=p[i].y+d[k][1];
if(abs(g[x][y])<=abs(g[X][Y]))Merge(getf(bh[x][y]),getf(bh[X][Y]));
}
if(abs(p[i+1].w)!=abs(p[i].w))
for(int j=i;abs(p[j].w)==abs(p[i].w);--j)
if(g[p[j].x][p[j].y]>0)
{
int u=getf(bh[p[j].x][p[j].y]);
if(!pl[u])pl[u]=1,++ans;
}
}
printf("%d\n",ans);
return 0;
}

【Luogu3457】POW-The Flood(并查集)的更多相关文章

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

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

  2. [POI2007]洪水pow 并查集

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

  3. poj2236(并查集)

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

  4. POJ 2236 Wireless Network (并查集)

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

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

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

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

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

  7. Codeforces445B(SummerTrainingDay06-N 并查集)

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

  8. Wireless Network 并查集

    An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wi ...

  9. 【bzoj5133】[CodePlus2017年12月]白金元首与独舞 并查集+矩阵树定理

    题目描述 给定一个 $n\times m$ 的方格图,每个格子有 ↑.↓.←.→,表示从该格子能够走到相邻的哪个格子.有一些格子是空着的,需要填上四者之一,需要满足:最终的方格图中,从任意一个位置出发 ...

随机推荐

  1. php 生成缩略图

    $src = '4.jpg'; list($width,$height) = getimagesize($src); $im = imagecreatefromjpeg($src); $panl = ...

  2. Tomcat服务器的配置

    本地安装的Tomcat服务器版本是 Apache Tomcat/7.0.42 启动 localhost 使用Tomcat的前提是安装了jdk,我在本地安装了jdk7.Tomcat服务器的文件目录为F: ...

  3. angular-file-upload封装为指令+图片尺寸限制

    不了解angular-file-upload基础使用 请先参考http://blog.csdn.net/lai_xu/article/details/49535847 博客地址 下文如果有更好的建议请 ...

  4. python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  5. Qt ActiveX web dome 详细例子

    http://doc.qt.io/qt-5.9/activeqt-server.html hierarchy 例子 #ifndef OBJECTS_H #define OBJECTS_H #inclu ...

  6. POJ - 3984 bfs [kuangbin带你飞]专题一

    bfs搜索过程中将路径保存下即可. AC代码 #include<cstdio> #include<cstring> #include<algorithm> #inc ...

  7. 【BZOJ1834】 网络扩容

    Time Limit: 1000 ms   Memory Limit: 128 MB Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费 ...

  8. HashMap并发导致死循环 CurrentHashMap

    为何出现死循环简要说明 HashMap闭环的详细原因 cocurrentHashMap的底层机制 为何出现死循环简要说明 HashMap是非线程安全的,在并发场景中如果不保持足够的同步,就有可能在执行 ...

  9. python︱函数、for、_name_杂记

    新手入门python,开始写一些简单函数,慢慢来,加油~ 一.函数 def myadd(a=1,b=100): result = 0 i = a while i <= b: # 默认值为1+2+ ...

  10. 理解Android DecorView

    一.DecorView为整个Window界面的最顶层View. 二.DecorView只有一个子元素为LinearLayout.代表整个Window界面,包含通知栏,标题栏,内容显示栏三块区域. 三. ...