【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. 将html table 转成 excel

    package com.sun.office.excel; /** * 跨行元素元数据 * */ public class CrossRangeCellMeta { public CrossRange ...

  2. POJ 1021 2D-Nim

    Description The 2D-Nim board game is played on a grid, with pieces on the grid points. On each move, ...

  3. SQL SERVER FOR LINUX初体验

    今天得空,就在Ubuntu17.04上安装了SQL SERVER 2017体验下,总体来说还是不错的. 在Ubuntu上安装SQL SERVER 2017还是比较方便的,只需几条命令即可: curl ...

  4. Linux-PATH_环境变量

    PATH变量         是linux系统里的一个环境变量,系统已经定义好了,我们不需要再定义. 作用:         是linux里使用的命令都存在在PATH变量后面指定的目录下,我们使用命令 ...

  5. Windows Server 2016-存储新增功能

    本章给大家介绍有关Windows Server 2016 中存储方面的新增功能,具体内容如下: 1.Storage Spaces Direct: 存储空间直通允许通过使用具有本地存储的服务器构建高可用 ...

  6. vue——安装并新建项目

    一.对于vue的安装: 1.安装vue之前先安装node,https://nodejs.org/zh-cn/download/,我装的是windows64位的: 2.下载好了之后就可以按照正常顺序安装 ...

  7. 如何使用supervisor管理你的应用

    1.前言 Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是UNIX-like系统下的一个进程管理工具,不支持Windo ...

  8. 吾八哥学Selenium(一):Python下的selenium安装

    selenium简介 Selenium也是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozilla Firefox.Mo ...

  9. Django里使用open函数

    Django里使用open函数 前言 在Django里使用open函数打开一个文件的时候,常常会遇到路径错误的问题.我在Django APP里写了一个爬虫用于为网站提供数据,但是需要打开文件,也就是在 ...

  10. Cisco Packet Tracer 6.0 实验笔记

    开篇:组建小型局域网 实验任务 1.利用一台型号为2960的交换机将2pc机互连组建一个小型局域网: 2.分别设置pc机的ip地址: 3.验证pc机间可以互通. 实验设备 Switch_2960 1台 ...