博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu345: [POI2007]POW-The Flood
阅读量:5907 次
发布时间:2019-06-19

本文共 2172 字,大约阅读时间需要 7 分钟。

题意

Sol

贪心

从小到大枚举高度,把小于等于这一高度的相邻格子用并查集合并
那么这个集合内的所有格子都一定可以由这个集合内的一个最低点抽完水
那么合并之后(一定要在合并之后)
判断这一高度是否有城市,有则检查它所在的集合是否放了抽水机,没有就在这个集合中放一个

# include 
# define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeof(a))# define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)using namespace std;typedef long long ll;const int _(1005);IL int Input(){ RG int x = 0, z = 1; RG char c = getchar(); for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1; for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48); return x * z;}int n, m, ans, h[_][_], id[_][_], cnt, type[_][_], done[_ * _];int que[_ * _];int fa[_ * _], dx[4] = {1, -1}, dy[4] = {0, 0, 1, -1};struct Data{ int x, y, id; IL bool operator <(RG Data B) const{ return h[x][y] < h[B.x][B.y]; }} p[_ * _];IL int Find(RG int x){ return fa[x] == x ? x : fa[x] = Find(fa[x]);}IL void Union(RG int Sx, RG int Sy, RG int fx){ for(RG int i = 0; i < 4; ++i){ RG int xx = Sx + dx[i], yy = Sy + dy[i]; if(xx < 1 || yy < 1 || xx > n || yy > m || h[xx][yy] > h[Sx][Sy]) continue; RG int fy = Find(id[xx][yy]); fx = Find(fx); if(fx == fy) continue; done[fx] |= done[fy], fa[fy] = fx; }}int main(RG int argc, RG char* argv[]){ n = Input(), m = Input(); for(RG int i = 1; i <= n; ++i) for(RG int j = 1; j <= m; ++j){ h[i][j] = Input(), type[i][j] = h[i][j] > 0; if(!type[i][j]) h[i][j] = -h[i][j]; id[i][j] = ++cnt, fa[cnt] = cnt, p[cnt] = (Data){i, j, cnt}; } sort(p + 1, p + cnt + 1); for(RG int i = 1, now; i <= cnt; ++i){ if(h[p[i].x][p[i].y] != now){ while(que[0]){ RG int x = Find(que[que[0]--]); if(!done[x]) done[x] = 1, ++ans; } now = h[p[i].x][p[i].y]; } Union(p[i].x, p[i].y, p[i].id); if(type[p[i].x][p[i].y]) que[++que[0]] = p[i].id; } while(que[0]){ RG int x = Find(que[que[0]--]); if(!done[x]) done[x] = 1, ++ans; } printf("%d\n", ans); return 0;}

转载于:https://www.cnblogs.com/cjoieryl/p/8466932.html

你可能感兴趣的文章
C++的Json解析库:jsoncpp和boost .
查看>>
vs里怎么看当前项目.net版本?
查看>>
Android开发资料[2012-12-16]
查看>>
Android 蓝牙开发:第一日
查看>>
CSS中的after
查看>>
gPodder 3.4 发布,播客接收器
查看>>
Extjs DomHelper Template
查看>>
学几个vim快捷键
查看>>
EventThread线程对VSync的接收
查看>>
[转]WCF+WF双剑合璧构建微软的SOA系列(一):从一个简单的Demo开始
查看>>
Linux下完整的RMAN增量备份shell脚本
查看>>
Java笔记01:异常处理Throwable类
查看>>
Ubuntu和RedHat的区别
查看>>
nodejs上HTML分析利器node-jquery
查看>>
iReport+jasperReports制作WEB报表
查看>>
分享:十Python之Http Web服务(网页抓取二)
查看>>
IBM is still thinking!
查看>>
分享一个用Xcode4实现基于Webservice用户登录的iphone程序
查看>>
EZNamespaceExtensions.Net v2013增加对上下文菜单、缩略图、图标、属性表的支持
查看>>
WebGL学习笔记-使用3D引擎threeJS实现星空粒子移动
查看>>