牛客网 - [牛客OI周赛8-提高组]用水填坑(优先队列)
题目链接:https://ac.nowcoder.com/acm/contest/403/A
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
现有一块n*m的地,每块1*1的地的高度为hi,j,在n*m的土地之外的土地高度均为0(即你可以认为最外圈无法积水)
现在下了一场足够大的雨,试求出这块地总共积了多少单位体积的水
输入描述
第一行两个数 n, m,具体含义见题意
接下来 n 行每行 m 个数, 第 i 行为 hi,1, hi,2, ..., hi,m
输出描述
输出一行一个数表示积水的总量。
输入
5 5
0 0 5 0 0
0 4 3 8 2
9 5 7 2 7
1 9 6 5 4
1 0 0 6 2
10 10
0 0 0 0 0 0 0 0 0 0
0 5 2 6 4 3 1 7 8 0
0 6 4 2 3 5 1 4 6 0
0 3 6 4 1 2 4 7 8 0
0 2 5 5 1 2 3 4 4 0
0 2 3 1 5 4 4 1 4 0
0 4 1 2 3 4 5 2 1 0
0 7 5 5 1 5 4 5 7 0
0 1 3 5 5 4 6 8 7 0
0 0 0 0 0 0 0 0 0 0
输出
4
23
备注:
- 对于10%的数据, n, m ≤ 4, h ≤ 5;
- 对于前50%的数据, n, m ≤ 20, h ≤ 10;
- 对于前70%的数据, n, m ≤ 100, h ≤ 50;
- 对于另外10%的数据, 不存在两个连续的块能积水;
- 对于95%的数据, n, m ≤ 500, h ≤ 100.
- 对于100%的数据, n, m ≤ 1000, h ≤ 1000,000,000.
解题思路
一个位置能存下多少水是由四周最低的柱子高度决定的,所以我们先把边缘位置的高度存起来,然后找出最低的,每次都从最低的边界向内部注水(仅与边界相邻的内部),推出四周四个位置的水高度,如果发现高度比本位置低的就说明此位置最高的水位就是本位置的高度,比本位置高的说明存不下水。然后把注水后的柱子当作新的边界,也就是把边界放到一个优先队列中,每次都让高度最小的边界出队(优先队列)。
#include <bits/stdc++.h>
const int MAXN = 1005;
using namespace std;
struct edge {int x, y, h;friend bool operator < (edge a, edge b) {return a.h > b.h;}
}u;
int n, m, vis[MAXN][MAXN], mp[MAXN][MAXN];
int arr[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
bool Judge(int x, int y) {if (x >= 0 && x < n && y >= 0 && y < m && !vis[x][y])return true;return false;
}
priority_queue <edge> Q;
int main() {long long ans;while (~scanf("%d%d", &n, &m)) {ans = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {vis[i][j] = 0;scanf("%d", &mp[i][j]);if (!i || !j || i == n - 1 || j == m - 1) {vis[i][j] = 1;Q.push((edge){i, j, mp[i][j]});}}}while (!Q.empty()) {u = Q.top();Q.pop();for (int i = 0; i < 4; i++) {int tx = u.x + arr[i][0];int ty = u.y + arr[i][1];if (Judge(tx, ty)) {vis[tx][ty] = 1;if (u.h > mp[tx][ty]) {ans += 1ll * (u.h - mp[tx][ty]);mp[tx][ty] = u.h;}Q.push((edge){tx, ty, mp[tx][ty]});}}}printf("%lld\n", ans);}return 0;
}
牛客网 - [牛客OI周赛8-提高组]用水填坑(优先队列)相关推荐
- 【牛客OI周赛7-普及组ABCD 非官方题解】暴力,二分,KMP,尺取(STL或Hash)
A: 链接:https://ac.nowcoder.com/acm/contest/372/A 来源:牛客网 某天,一只可爱的肥橘喵在路上走,突然遇到了一个怪人,那怪人自称PM6,"小肥喵, ...
- 【牛客 - 371牛客OI周赛7-提高组B】小睿睿的询问(RMQ,ST表维护下标)
题干: 链接:https://ac.nowcoder.com/acm/contest/371/B 来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小 ...
- 【牛客 - 371牛客OI周赛7-提高组A】小睿睿的等式(dp,暴力 )
题干: 链接:https://ac.nowcoder.com/acm/contest/371/A 来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如"A+B=n"的等 ...
- 牛客OI周赛2-提高组
A.游戏 链接:https://www.nowcoder.com/acm/contest/210/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他 ...
- 牛客OI周赛7-提高组 A 小睿睿的等式
链接:https://ac.nowcoder.com/acm/contest/371/A 来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如"A+B=n"的等式且使用 ...
- 牛客OI周赛7-提高组 B小睿睿的询问(ST打表)
链接:https://ac.nowcoder.com/acm/contest/371/B 来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小睿睿想知 ...
- 牛客网 牛客练习赛13 A.幸运数字Ⅰ
A.幸运数字Ⅰ 链接:https://www.nowcoder.com/acm/contest/70/A 来源:牛客网 水题. 代码: 1 #include<iostream> 2 #in ...
- 牛客网 牛客练习赛13 C.幸运数字Ⅲ-思维
C.幸运数字Ⅲ 链接:https://www.nowcoder.com/acm/contest/70/C 来源:牛客网 这个题447和477是特殊的,其他的就没什么了. 代码: 1 #include& ...
- 牛客网 牛客小白月赛1 H.写真がとどいています
H.写真がとどいています 链接:https://www.nowcoder.com/acm/contest/85/H 来源:牛客网 这个题数乱了,导致wa了好几次. 特别弱智,从A开始往上,就是A,B, ...
最新文章
- 极限中0除以常数_高中物理必知的50个关键常数, 每个都是得分点!
- Kafka manager安装 (支持0.10以后版本consumer)
- WebService、WCF、WebAPI、MVC的区别
- 直播 | ACL 2021论文解读:为结构预测问题自动寻找更强的词嵌入拼接方式
- python的flask实现第三方登录怎么写_关于qq和新浪微博的第三方登陆|python|flask
- mysql主从1594错误_3分钟解决MySQL主从1594错误
- 国内外黑客居然都在这些地方聚集
- 深入浅出通信原理知识点8
- 将域名从易名中国(www.ename.cn)转移到中国万网(www.net.cn)
- idea全局查找字段
- java后台管理系统做Excel导入
- XOI2003赛后题解
- Mysql学习笔记(一)学完就出师系列哈哈哈
- 为 什 么 说 Synchronized 是 非 公 平 锁
- 细说ItemInfo
- 运营人员必知!SPU和SKU是什么?
- Android 集成Face++ 人脸识别(3.0+SDK)
- FSAA (FullSceneAnti-aliasing)全屏抗锯齿技术
- 大数据平台测试目标与测试指标
- EXCEL如何设置,使表格能自动调整列宽以适应文字长度