题目传送门

  需要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. cocos2d-X JS 获取cocostudio中的UI组件

    1.先加载cocostudio导出的json文件,代码如下所示: var dong = ccs.load("res/Login.json"); //_login.setPositi ...

  2. dotnet 命令

    以下用实例串起dotnet常用命令,带你玩转dotnet命令. 1.创建(dotnet new) 首先我们创建一个项目,这里我们创建控制台程序,命令如下图所示. dotnet new dotnet n ...

  3. [提权] 脏牛漏洞 Dirty COW CVE-2016-5195 2.6.22 < 3.9 (x86/x64)

    /* * (un)comment correct payload first (x86 or x64)! * * $ gcc cowroot.c -o cowroot -pthread * $ ./c ...

  4. POJ 3233 Matrix Power Series(二分等比求和)

    Matrix Power Series [题目链接]Matrix Power Series [题目类型]二分等比求和 &题解: 这题我原来用vector写的,总是超时,不知道为什么,之后就改用 ...

  5. JavaScript数组去重方法总结

    一.双重遍历去重 function onlyFigure(arr) { let newarr = []; const length = arr.length for (let i = 0; i < ...

  6. Jenkins实现自动化部署

    首先登录到服务器,目前我所使用的program-DEV环境所在服务器为:IP     登录密码为:密码 1.基础配置 检查所有环境变量: $ env 2.下载安装包安装 JDK:由于本机器已经安装,这 ...

  7. SpringMVC探究-----从HelloWorld开始

       1.SpringMVC简介 Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离. 它的设计是围绕Dispatch ...

  8. [openjudge-搜索]哆啦A梦的时光机

    题目描述 描述 哆啦A梦有一个神奇的道具:时光机.坐着它,大雄和他的伙伴们能穿越时空,回到过去或者去到未来. 有一天,大雄和他的伙伴们想穿越时空进行探险,可是时光机却出了一点故障,只能进行有限的时空穿 ...

  9. 20165305 苏振龙《Java程序设计》第九周学习总结

    第十三章 Java网络编程 学习了解用于网络编程的类,了解URL.Socket.InetAddress和DatagramSocket类在网络编程中的重要作用 使用URL创建对象的应用程序称作客户端程序 ...

  10. Linux基础命令---tracepath追踪路由信息

    tracepath tracepath指令可以追踪数据到达目标主机的路由信息,同时还能够发现MTU值.它跟踪路径到目的地,沿着这条路径发现MTU.它使用UDP端口或一些随机端口.它类似于Tracero ...