BZOJ2936 Codevs3634 POI1999 积水


题目描述

有这样一块土地,它可以被划分成N×M个正方形小块,每块面积是一平方英寸,第i行第j列的小块可以表示成P(i,j)。这块土地高低不平,每一小块地P(i,j)都有自己的高度H(i,j)(单位是英寸)。

一场倾盆大雨后,这块地由于地势高低不同,许多低洼地方都积存了不少降水。假如你已经知道这块土地的详细信息,你能求出它最多能积存多少立方英寸的降水么?

输入格式

输入文件第一行有两个数,N,M(1<=N, M <=100),表示土地的规模是N×M平方英寸。

以下有N行,每行有M个整数,表示每块地的高低(每个整数在[1,10000]内,以英寸为单位)。

输出格式

输出文件只有一行,一个数,表示土地中最多能积存多少立方英寸的水。

样例输入

3 6

3 3 4 4 4 2

3 1 3 2 1 4

7 3 1 6 4 1

样例输出

5


先%一下yyf大神的题解

我们考虑一层一层地向图中加水

这样的话当我们考虑到v这个高度,所有小于v的高度我们都已经考虑过了

所以我们只考虑当前有多少个位置可以加入一层水

对于边界上的节点,我们需要排除掉,所以我们用0表示已经删除掉的集合,所以把需要删除的节点和0连接起来,否则的话我们需要维护高度相同的联通块的连通性,就把当前块和周围已经访问过的块连接起来就行了

所以用并查集维护siz


#include <bits/stdc++.h>
using namespace std;
#define N 110
#define V 10010
int mx[4]={0,0,1,-1};
int my[4]={1,-1,0,0};
namespace Union_Find{
int fa[V],siz[V];
void init(int n){
fa[0]=siz[0]=0;
for(int i=1;i<=n;i++)fa[i]=i,siz[i]=1;
}
int find(int x){
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
void merge(int x,int y){
int fx=find(x),fy=find(y);
if(fx==fy)return;
siz[fy]+=siz[fx];
fa[fx]=fy;
}
};
int n,m;
bool vis[N][N];
vector<pair<int,int> > g[V];
bool checkin(int x,int y){
if(x<1||y<1||x>n||y>m)return 0;
return 1;
}
int id(int x,int y){
if(!checkin(x,y))return 0;
return (x-1)*m+y;
}
int cnt=0,ans=0;
int main(){
using namespace Union_Find;
freopen("2936.in","r",stdin);
scanf("%d%d",&n,&m);
init(n*m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
int vl;scanf("%d",&vl);
g[vl].push_back(pair<int,int>(i,j));
}
int up=n*m;
for(int v=1;v<=V;v++){//考虑一层一层地加水
if(siz[find(0)]==up)break;
for(int j=0;j<g[v].size();j++){
int x=g[v][j].first,y=g[v][j].second;
vis[x][y]=1;
cnt++;
for(int k=0;k<4;k++){
int nx=x+mx[k],ny=y+my[k];
//如果当前点在边界上或者旁边有比它低的点就合并起来
//在边界上siz[0]++ 说明这个点不可取
//不在边界上维护可以到达的联通块
if(!checkin(nx,ny)||vis[nx][ny])merge(id(nx,ny),id(x,y));
}
}
ans+=cnt-siz[find(0)];
}
printf("%d",ans);
return 0;
}

BZOJ2936 Codevs3634 POI1999 积水 【并查集】*的更多相关文章

  1. [NOI2018] 归程 可持久化并查集

    题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个n 个节点.m 条边的无向连通图(节点的编号从 1至 n).我们依次用 l,a描述一条边的长度.海拔. ...

  2. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  3. 关押罪犯 and 食物链(并查集)

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...

  4. 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

    图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...

  5. bzoj1854--并查集

    这题有一种神奇的并查集做法. 将每种属性作为一个点,每种装备作为一条边,则可以得到如下结论: 1.如果一个有n个点的连通块有n-1条边,则我们可以满足这个连通块的n-1个点. 2.如果一个有n个点的连 ...

  6. [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)

    Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...

  7. [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  8. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

  9. Codeforces 731C Socks 并查集

    题目:http://codeforces.com/contest/731/problem/C 思路:并查集处理出哪几堆袜子是同一颜色的,对于每堆袜子求出出现最多颜色的次数,用这堆袜子的数目减去该值即为 ...

随机推荐

  1. HtmlAgilityPach基本使用方法

    //过滤html标签 static void InnerText() { HtmlWeb htmlWeb = new HtmlWeb(); HtmlDocument doc = htmlWeb.Loa ...

  2. angular指令与指令交互

    app.directive('mansory',function(){ return { controller:function($scope){ this.changed = function(){ ...

  3. Android 数据库 ObjectBox 源码解析

    一.ObjectBox 是什么? greenrobot 团队(现有 EventBus.greenDAO 等开源产品)推出的又一数据库开源产品,主打移动设备.支持跨平台,最大的优点是速度快.操作简洁,目 ...

  4. Nordic老版官网介绍(2018-11-30停止更新)

    1. Nordic官网及资料下载 Nordic官网主页:https://www.nordicsemi.com/,进入官网后,一般点击“Products”标签页,即进入Nordic产品下载首页,其独立链 ...

  5. [eclipse]Syntax error on tokens, delete these tokens问题解决

    错误:Syntax error on tokens, delete these tokens 出现这样的错误一般是括号.中英文字符.中英文标点.代码前面的空格,尤其是复制粘贴的代码,去掉即可. 如下图 ...

  6. python中如何剔除字符串

    问题: 过滤用户输入中前后多余的空白字符 ‘    ++++abc123---    ‘ 过滤某windows下编辑文本中的’\r’: ‘hello world \r\n’ 去掉文本中unicode组 ...

  7. LM3S之boot loader学习笔记-1

    LM3S之boot loader学习笔记-1 彭会锋 (首先声明,此系列文章编写参考了很多资料,其中一些内容是原版内容的引用和整理,并加入了一些自己的见解,我已经尽量标明引用部分,如有未全部标注部分, ...

  8. word2016_统计字数

    统计字数 审阅->字数统计

  9. 012PHP基础知识——运算符(五)

    <?php /** * 运算符的短路: * && 逻辑与 || 逻辑或 存在短路: */ /* $a = 1; $a==1 ||$c=100; //逻辑或:第一个表达式返回tru ...

  10. 019——VUE中v-for与computer结合功能实例讲解

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...