题目传送门

  需要root权限的传送门

题目大意

  有一个$n\times m$的网格图,每一格都有一个高度。一次降雨过后问最多能积多少水。

  考虑算每一高度能储存的水的量。

  如果小于等于这个高度的格子和边界连通,那么水就会流走,这一部分不能算入答案。

  所以用并查集维护高度小于等于当前高度的格子的连通性。每次答案加已经找到的格子数目减去和边界连通的格子数。

  时间复杂度$O(nm + V)$。(用真·并查集就是这样)

  网上咋一群带个log的做法。想去loj出个加强版。

Code

 /**
* bzoj
* Problem#2936
* Accepted
* Time: 56ms
* Memory: 1688k
*/
#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; const int N = , V = ;
const int mov[][] = {{, }, {, }, {, -}, {-, }}; typedef class Dsu {
public:
int *f;
int *siz; Dsu() { }
Dsu(int n) {
f = new int[(n + )];
siz = new int[(n + )];
f[] = siz[] = ;
for (int i = ; i <= n; i++)
f[i] = i;
for (int i = ; i <= n; i++)
siz[i] = ;
} int find(int x) {
return (f[x] == x) ? (x) :(f[x] = find(f[x]));
} void unit(int x, int y) {
int fx = find(x);
int fy = find(y);
if (fx == fy)
return;
siz[fy] += siz[fx];
f[fx] = fy;
}
}Dsu; int n, m;
Dsu uf;
boolean found[N][N];
vector< pair<int, int> > vs[V + ]; int id(int x, int y) {
if (!x || !y || x == n + || y == m + )
return ;
return (x - ) * m + y;
} inline void init() {
scanf("%d%d", &n, &m);
uf = Dsu(n * m);
for (int i = ; i <= n; i++)
for (int j = , h; j <= m; j++) {
scanf("%d", &h);
vs[h].push_back(pair<int, int>(i, j));
}
} int cfound = , res = ;
inline void solve() {
int all = n * m;
for (int v = ; v <= V && uf.siz[uf.find()] != all; v++) {
for (int j = ; j < (signed) vs[v].size(); j++) {
int x = vs[v][j].first, y = vs[v][j].second;
found[x][y] = true, cfound++;
for (int k = ; k < ; k++) {
int nx = x + mov[k][], ny = y + mov[k][], nxid = id(nx, ny);
if (!nxid || found[nx][ny])
uf.unit(nxid, id(x, y));
}
}
res += cfound - uf.siz[uf.find()];
}
printf("%d", res);
} int main() {
init();
solve();
return ;
}

bzoj 2936 [Poi 1999] 降水 - 并查集的更多相关文章

  1. BZOJ.2054.疯狂的馒头(并查集)

    BZOJ 倒序处理,就是并查集傻题了.. 并查集就是确定下一个未染色位置的,直接跳到那个位置染.然而我越想越麻烦=-= 以为有线性的做法,发现还是要并查集.. 数据随机线段树也能过去. //18400 ...

  2. 2021.08.03 BZOJ 疯狂的馒头(并查集)

    2021.08.03 BZOJ 疯狂的馒头(并查集) 疯狂的馒头 - 题目 - 黑暗爆炸OJ (darkbzoj.tk) 重点: 1.并查集的神奇运用 2.离线化 题意: 给一个长为n的序列,进行m次 ...

  3. BZOJ 4195: [Noi2015]程序自动分析 并查集+离散化

    LUOGU 1955BZOJ 4195 题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量 ...

  4. bzoj 2733 永无乡 - 并查集 - 线段树

    永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛. ...

  5. bzoj 3673&3674 可持久化并查集&加强版(可持久化线段树+启发式合并)

    CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...

  6. bzoj 1854 游戏 二分图匹配 || 并查集

    题目链接 Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的 ...

  7. Luogu P2391 白雪皑皑 && BZOJ 2054: 疯狂的馒头 并查集

    4月的时候在luogu上做过 白雪皑皑 这道题,当时一遍AC可高兴了qwq,后来去了个厕所,路上忽然发现自己的做法是错的qwq...然后就咕咕了qwq 今天看到了 疯狂的馒头 ,发现一毛一样OvO.. ...

  8. 【BZOJ 3674】可持久化并查集加强版&【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之

    最后还是去掉异或顺手A了3673,,, 并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦 1:判断是否属于同一集合,我加了路径压缩. 2:直接把跟的值指向root[k]的值破 ...

  9. 【BZOJ】3673: 可持久化并查集 by zky & 3674: 可持久化并查集加强版(可持久化线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3674 http://www.lydsy.com/JudgeOnline/problem.php?id ...

随机推荐

  1. ANTLR4权威指南 - 第5章 设计语法

    在第I部分,我们熟悉了ANTLR,并在一个比较高的层次上了解了语法以及语言程序.现在,我们将要放慢速度来学习下实现更实用任务的一些细节上的技巧,例如建立内部数据结构,提取信息,生成输入对应的翻译内容等 ...

  2. LA 4992 Jungle Outpost(半平面交)

    Jungle Outpost [题目链接]Jungle Outpost [题目类型]半平面交 &题解: 蓝书282 我自己写的代码居然AC了!!! 刘汝佳的说要right要-3什么的,还要特判 ...

  3. docker中crontab无法执行

    1.下载的镜像是ubuntu最简版,默认没有安装crontab 2.业务需求需要crontab 最早解决方案 1.在宿主机里面 1 3  * * * root  cd /data/wwwroot/xx ...

  4. [2]传奇3服务器源码分析一 LoginServer

    留存 服务端下载地址: 点击这里

  5. STL之Deque容器

    1.Deque容器 1)deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. 2)deque在接口上和vect ...

  6. modelsim仿真正确FPGA运行不正确的可能原因 - cm4写寄存器错

    困住整整一周了,工作进行不下去,中午偶遇导师,指导意见是有两种可能: 1.  FPGA编译器优化代码,可以考虑把综合过程中所有的warning排查一下 2.  verilog里有不可综合的语句. 又及 ...

  7. 2.scrapy安装

    A.Anaconda如果已安装,那么可以通过 conda 命令安装 Scrapy,安装命令如下: conda install Scrapy   ============================ ...

  8. django models数据库操作

    一.数据库操作 1.创建model表         基本结构 1 2 3 4 5 6 from django.db import models     class userinfo(models.M ...

  9. 设计模式之Adapter(适配器)(转)

    定义: 将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 为何使用? 我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是 ...

  10. linux下卸载mysql(rpm)

    linux下卸载mysql 查看是否安装了mysql的组件 rpm –qa |grep –I mysql 卸载前关闭mysql服务 service mysql status service mysql ...