【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. 通过WMI获取机器信息

    PerformanceCounter的介绍就不多说了,MSDN上介绍的很详细: https://msdn.microsoft.com/zh-cn/library/system.diagnostics. ...

  2. composer引用本地git做为源库

    PHP使用者大多对composer是又爱又恨,爱的是composer require后,很多类库不用去下载了,恨的是网速卡成翔,虽然国内有很多道友做了镜象,但对于bower库这些都还是整体更新. 那么 ...

  3. nginx的负载均衡集群测试

    分别在3台机子安装nginx和启动nginx服务. dir: 192.168.0.7 另外2台服务器为 192.168.0.5 ,192.168.0.6 在dir  192.168.0.7 上增加配置 ...

  4. [NOIP]2016天天爱跑步

    [NOIP]2016天天爱跑步 标签: LCA 树上差分 NOIP Description 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是 ...

  5. eslint规则

    碰到eslint报错, 把错误的提示拷贝在这里Ctrl + F找到复制到eslint.js里面就行了. "off"或者0,不启用这个规则 "warn"或者1,出 ...

  6. 加入GIMPS项目,寻找梅森素数!

    截止到目前为止人类共找到了50个梅森素数,其中最后16个梅森素数都是通过GIMPS项目找到的. 为了激励人们寻找梅森素数和促进网格技术发展,总部设在美国旧金山的电子前沿基金会(EFF)于1999年3月 ...

  7. Java经典编程题50道之九

    一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程找出1000以内的所有完数. public class Example09 {    public s ...

  8. Linux系统上安装JDK1.8

    1,下载jdk1.8 首先进入jdk下载目录:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213315 ...

  9. JSTL的相关使用

    index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UT ...

  10. 用一个简单的例子比较SVM,MARS以及BRUTO(R语言)

    背景重述 本文是ESL: 12.3 支持向量机和核中表12.2的重现过程.具体问题如下: 在两个类别中产生100个观测值.第一类有4个标准正态独立特征\(X_1,X_2,X_3,X_4\).第二类也有 ...