【题目描述】 有一块矩形土地被划分成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 field
int wtr;//height of the water
bool vis;//visited or not
};
field f[][];
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[]={, , -, }, my[]={-, , , };
int n, m; void in_put(){
scanf("%d%d", &n, &m);
for(int i=; i<=n; i++)
for(int j=; j<=m; j++){
scanf("%d", &f[i][j].ht);
if(i== || i==n || j== || j==m){
f[i][j].vis = true;
if(f[i][j].ht >= ){
q.push({i, j, f[i][j].ht});
f[i][j].wtr = ;
}
else{
q.push({i, j, });
f[i][j].wtr = - f[i][j].ht;
}
}
}
}
void out_put(){
for(int i=; i<=n; i++){
for(int j=; 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=; i<; i++){
int nx = temp.x + mx[i], ny = temp.y + my[i];
if(nx>= && nx<=n && ny>= && ny<=m && !f[nx][ny].vis){
if(f[nx][ny].ht >= temp.ht){
f[nx][ny].wtr = ;
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 ;
}

另一种相似做法(题解):

一个块的高度就是从这个块走出矩形的所有路径上的最大值的最小值。

新建一个点代表矩形外部。相邻块之间连边,权值为两块的较大值,矩形边界的块向矩形外部连边,权值为max(高度,0),求出最小生成树,

时间复杂度O(nmlog(nm))。

暑期集训20190727 水(water)的更多相关文章

  1. 7.30 正睿暑期集训营 A班训练赛

    目录 2018.7.30 正睿暑期集训营 A班训练赛 T1 A.蔡老板分果子(Hash) T2 B.蔡老板送外卖(并查集 最小生成树) T3 C.蔡老板学数学(DP NTT) 考试代码 T2 T3 2 ...

  2. 2014 SCAU_ACM 暑期集训

    暑期集训,希望能在这段时间获得对得起自己的提升吧 时间:7.11~8.30 集训各专题内容: 1.贪心,递推,基础DP(背包,区间DP,状态压缩DP(去年出了不少于2道铜牌题,看着办)) 2.搜索(B ...

  3. 2014年CCNU-ACM暑期集训总结

    2014年CCNU-ACM暑期集训总结 那个本期待已久的暑期集训居然就这种.溜走了.让自己有点措手不及.很多其它的是对自己的疑问.自己是否能在ACM这个领域有所成就.带着这个疑问,先对这个暑假做个总结 ...

  4. 8.10 正睿暑期集训营 Day7

    目录 2018.8.10 正睿暑期集训营 Day7 总结 A 花园(思路) B 归来(Tarjan 拓扑) C 机场(凸函数 点分治) 考试代码 A B C 2018.8.10 正睿暑期集训营 Day ...

  5. 8.6 正睿暑期集训营 Day3

    目录 2018.8.6 正睿暑期集训营 Day3 A 亵渎(DP) B 绕口令(KMP) C 最远点(LCT) 考试代码 A B C 2018.8.6 正睿暑期集训营 Day3 时间:5h(实际) 期 ...

  6. 8.9 正睿暑期集训营 Day6

    目录 2018.8.9 正睿暑期集训营 Day6 A 萌新拆塔(状压DP) B 奇迹暖暖 C 风花雪月(DP) 考试代码 A B C 2018.8.9 正睿暑期集训营 Day6 时间:2.5h(实际) ...

  7. 8.8 正睿暑期集训营 Day5

    目录 2018.8.8 正睿暑期集训营 Day5 总结 A 友谊巨轮(线段树 动态开点) B 璀璨光滑 C 构解巨树 考试代码 A B C 2018.8.8 正睿暑期集训营 Day5 时间:3.5h( ...

  8. 8.7 正睿暑期集训营 Day4

    目录 2018.8.7 正睿暑期集训营 Day4 A 世界杯(贪心) B 数组(线段树) C 淘汰赛 考试代码 A B C 2018.8.7 正睿暑期集训营 Day4 时间:5h(实际) 期望得分:. ...

  9. 8.5 正睿暑期集训营 Day2

    目录 2018.8.5 正睿暑期集训营 Day2 总结 A.占领地区(前缀和) B.配对(组合) C 导数卷积(NTT) 考试代码 T1 T2 T3 2018.8.5 正睿暑期集训营 Day2 时间: ...

随机推荐

  1. MapReduce案例-好友推荐

    用过各种社交平台(如QQ.微博.朋友网等等)的小伙伴应该都知道有一个叫 "可能认识" 或者 "好友推荐" 的功能(如下图).它的算法主要是根据你们之间的共同好友 ...

  2. 把功能强大的Spring EL表达式应用在.net平台

    Spring EL 表达式是什么? Spring3中引入了Spring表达式语言—SpringEL,SpEL是一种强大,简洁的装配Bean的方式,他可以通过运行期间执行的表达式将值装配到我们的属性或构 ...

  3. ELK 学习笔记之 Logstash之filter配置

    Logstash之filter: json filter: input{ stdin{ } } filter{ json{ source => "message" } } o ...

  4. SoapUI 的几种常用参数化方式

    今天给大家来梳理下soapui这款工具关于参数化的几种方式以及具体的应用场景 1.properties 官方文档:https://www.soapui.org/docs/functional-test ...

  5. idea中的java web项目(添加jar包介绍)和java maven web项目目录结构

    java web项目 web项目下web根目录名称是可以更改的 idea中新建java web项目,默认src为Sources Root,当然也可以手动改,在Sources Root下右键只能新建Pa ...

  6. 什么是javascript字面量,常量,变量,直接量?

    1.字面量是变量的字符串表示形式.它不是一种值,而是一种变量记法. var a = 1 //1是字面量 var b = 'css' //css是字面量 var c = [5,6,7] //567是字面 ...

  7. call,apply和bind详解

    一.call和apply call和apply其实是同一个东西,区别只有参数不同,call是apply的语法糖,所以就放在一起说了,这两个方法都是定义在函数对象的原型上的(Function.proto ...

  8. [BZOJ1076] 奖励关

    Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的 ...

  9. 【Spring Cloud】客户端负载均衡组件——Ribbon(三)

    一.负载均衡 负载均衡技术是提高系统可用性.缓解网络压力和处理能力扩容的重要手段之一. 负载均衡可以分为服务器负载均衡和客户端负载均衡,服务器负载均衡由服务器实现,客户端只需正常访问:客户端负载均衡技 ...

  10. stm32cubeMX配置LWIP

    MCU:stm32f769NIHx  PHY:LAN8742A LWIP_VERSION:2.0.3 1.配置RCC,串口(printf debug log) (1)开启RCC,配置时钟系统 图1.1 ...