暑期集训20190727 水(water)
【题目描述】 有一块矩形土地被划分成n×m个正方形小块。这些小块高低不平,每一小 块都有自己的高度。水流可以由任意一块地流向周围四个方向的四块地中,但 是不能直接流入对角相连的小块中。 一场大雨后,由于地势高低不同,许多地方都积存了不少降水。假如你已 经知道这块土地的详细信息,你能求出每个小块的积水高度吗? 注意:假设矩形地外围的高度为 0。
【输入数据】 第一行包含两个非负整数n,m。 接下来n行每行m个整数表示第i行第j列的小块的高度。
【输出数据】 输出n行,每行m个由空格隔开的非负整数,表示每个小块的积水高度。
【样例输入】 3 3
4 4 0
2 1 3
3 3 -1
【样例输出】 0 0 0 0 1 0 0 0 1
【数据范围】 对于20%的数据,n,m<=4。 对于40%的数据,n,m<=15。 对于60%的数据,n,m<=50。 对于100%的数据,n,m<=300,小块高度的绝对值<=10^9。 在每一部分数据中,均有一半数据保证小块高度非负
把最外圈土地(紧挨外围)全部push进一个小根堆,
每次取出一个并插入所有相邻合法土地。
#include <bits/stdc++.h> using namespace std; struct field{int ht;//height of the fieldint wtr;//height of the waterbool vis;//visited or not }; field f[310][310]; struct pos{int x;int y;int ht;//the height used to calculate(as the height of water or land) }; priority_queue<pos> q; inline bool operator<(const pos &a, const pos &b){return a.ht>b.ht; }int mx[4]={0, 0, -1, 1}, my[4]={-1, 1, 0, 0}; int n, m;void in_put(){scanf("%d%d", &n, &m);for(int i=1; i<=n; i++)for(int j=1; j<=m; j++){scanf("%d", &f[i][j].ht);if(i==1 || i==n || j==1 || j==m){f[i][j].vis = true;if(f[i][j].ht >= 0){q.push({i, j, f[i][j].ht});f[i][j].wtr = 0;}else{q.push({i, j, 0});f[i][j].wtr = 0 - f[i][j].ht;}}} } void out_put(){for(int i=1; i<=n; i++){for(int j=1; j<=m; j++){printf("%d ", f[i][j].wtr); } printf("\n");}return; }int main(){freopen("water.in", "r", stdin);freopen("water.out", "w", stdout);in_put();while(!q.empty()){pos temp = q.top();q.pop();for(int i=0; i<4; i++){int nx = temp.x + mx[i], ny = temp.y + my[i];if(nx>=1 && nx<=n && ny>=1 && ny<=m && !f[nx][ny].vis){if(f[nx][ny].ht >= temp.ht){f[nx][ny].wtr = 0;q.push({nx, ny, f[nx][ny].ht});f[nx][ny].vis = true; }else{f[nx][ny].wtr = temp.ht - f[nx][ny].ht;q.push({nx, ny, temp.ht});f[nx][ny].vis = true;}}}}out_put();return 0; }
另一种相似做法(题解):
一个块的高度就是从这个块走出矩形的所有路径上的最大值的最小值。
新建一个点代表矩形外部。相邻块之间连边,权值为两块的较大值,矩形边界的块向矩形外部连边,权值为max(高度,0),求出最小生成树,
时间复杂度O(nmlog(nm))。
转载于:https://www.cnblogs.com/miserweyte/p/11270374.html
暑期集训20190727 水(water)相关推荐
- 7.30 正睿暑期集训营 A班训练赛
目录 2018.7.30 正睿暑期集训营 A班训练赛 T1 A.蔡老板分果子(Hash) T2 B.蔡老板送外卖(并查集 最小生成树) T3 C.蔡老板学数学(DP NTT) 考试代码 T2 T3 2 ...
- 题解报告(CDUT暑期集训——第三场)
题解报告(CDUT暑期集训--第三场) A - Problem A. Ascending Rating HDU - 6319 思路:单调队列板子题?(但是弱的一批的我还是不会用(有空补上 用的滑动窗口 ...
- 题解报告(CDUT暑期集训——第二场)
题解报告(CDUT暑期集训--第二场) D - Game HDU - 6312 思路:水题 Alice一直是必胜态 AC代码 #include<stdio.h> #include<i ...
- 题解报告(CDUT暑期集训——第四场)
题解报告(CDUT暑期集训--第四场) Problem D. Nothing is Impossible HDU - 6335 思路:水题 排个序循环判断就出来了 AC代码 #include<s ...
- 题解报告(CDUT暑期集训——第六场)
题解报告(CDUT暑期集训--第六场) A - oval-and-rectangle HDU - 6362 思路:水题 积分一化就出来了 AC代码 #include<stdio.h> #i ...
- 题解报告(CDUT暑期集训——第五场)
题解报告(CDUT暑期集训--第五场) B - Beautiful Now HDU - 6351 思路:直接暴力全排列就行了 最多\(10!\)次 题目限制2500ms 全排列大概是2000多ms(最 ...
- 暑期集训5:并查集 线段树 练习题G: HDU - 1754
2018学校暑期集训第五天--并查集 线段树 练习题G -- HDU - 1754 I Hate It 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让 ...
- 暑期集训5:并查集 线段树 练习题F: HDU - 1166
2018学校暑期集训第五天--并查集 线段树 练习题F -- HDU - 1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A ...
- 暑期集训5:并查集 线段树 练习题B: HDU - 1213
2018学校暑期集训第五天--并查集 线段树 练习题B -- HDU - 1213 How Many Tables Today is Ignatius' birthday. He invites ...
- 暑期集训5:并查集 线段树 练习题A: HDU - 1232
2018学校暑期集训第五天--并查集 线段树 练习题A -- HDU - 1232 畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅 ...
最新文章
- JVM class加载机制的总结 收藏
- 终止代码driver_irql_not_less_or_equal
- python与excel的区别-Python比较两个excel文档内容的异同
- Serverless 风起云涌,为什么阿里,微软,AWS 却开始折腾 OAM?
- 你绝对能懂的“机器学习”(五)
- pdo连接mysql数据库(简洁明了)
- Tensorboard可视化:基于LeNet5进行面部表情分类
- java中sql语句怎么把开始和结束时间作为参数写sql查询_java程序员跳槽的一道坎,大公司面试官都会问的Mybatis...
- shiro登陆失败提示_shiro在springMVC 如何处理登陆失败跳到登陆页面呢?
- 云服务器软件运行出错,云服务器程序运行中出现木马
- Kendo UI开发教程(25): 单页面应用(三) View
- Windows Phone开发(12):认识一下独具个性的磁贴
- 图说设计模式-结构型设计模式笔记
- 路由器修改html,徒手修改大麦路由器dw33d,变luci中文界面,并开启ssh
- selenium网易云登录定位不成功的问题
- discuz3x ucenter 与cas 初步整合
- Unity运行失败,Unsafe code may only appear if compiling with /unsafe
- 迅为stm32mp157开发板资料手册+实战教程+视频教程
- chrome浏览器去除蓝色边框和黄色背景色
- BP神经网络原理(附实验程序)