题目描述

有一块矩形土地被划分成$n\times 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\leqslant 4$。
对于$40\%$的数据$n,m\leqslant 15$。
对于$60\%$的数据$n,m\leqslant 50$。
对于$100\%$的数据$n,m\leqslant 300$,$|$小块高度$|\leqslant {10}^9$。
在每一部分数据中,均有一半数据保证小块高度非负。


题解

首先需要明确一个问题,每一个块的最终高度就是所有从这个块走出这个矩形当中的最大高度的最小值(通读左边这句话三遍!!!)。

然后我利用了类似$SPFA$的思想进行$BFS$,先将最外面一圈加入队列,然后去更新它所能更新四个点的答案,如果一个点被更新,那么就重新将这个点压入队列即可。

时间复杂度:$\Theta(n\times m\times k)$($k$为较小常数,其实时间复杂度我也不太会证,毕竟是类$SPFA$思想)。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,m;
long long Map[500][500];
long long dis[500][500];
queue<pair<int,int> > q;
void BFS()
{
while(!q.empty())
{
pair<int,int> flag=q.front(),wzc;
q.pop();
wzc=make_pair(flag.first-1,flag.second);
if(wzc.first>1&&wzc.second>1&&wzc.first<n&&wzc.second<m)
if(dis[wzc.first][wzc.second]>max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]))
{
dis[wzc.first][wzc.second]=max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]);
q.push(wzc);
}
wzc=make_pair(flag.first,flag.second-1);
if(wzc.first>1&&wzc.second>1&&wzc.first<n&&wzc.second<m)
if(dis[wzc.first][wzc.second]>max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]))
{
dis[wzc.first][wzc.second]=max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]);
q.push(wzc);
}
wzc=make_pair(flag.first+1,flag.second);
if(wzc.first>1&&wzc.second>1&&wzc.first<n&&wzc.second<m)
if(dis[wzc.first][wzc.second]>max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]))
{
dis[wzc.first][wzc.second]=max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]);
q.push(wzc);
}
wzc=make_pair(flag.first,flag.second+1);
if(wzc.first>1&&wzc.second>1&&wzc.first<n&&wzc.second<m)
if(dis[wzc.first][wzc.second]>max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]))
{
dis[wzc.first][wzc.second]=max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]);
q.push(wzc);
}
}
}
int main()
{
memset(dis,0x3f,sizeof(dis));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%lld",&Map[i][j]);
for(int i=1;i<=n;i++)
{
dis[i][1]=max(0LL,Map[i][1]);
dis[i][m]=max(0LL,Map[i][m]);
q.push(make_pair(i,1));
q.push(make_pair(i,m));
}
for(int i=1;i<=m;i++)
{
dis[1][i]=max(0LL,Map[1][i]);
dis[n][i]=max(0LL,Map[n][i]);
q.push(make_pair(1,i));
q.push(make_pair(n,i));
}
BFS();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%lld ",max(0LL,dis[i][j]-Map[i][j]));
puts("");
}
return 0;
}

rp++

[CSP-S模拟测试]:water(BFS)的更多相关文章

  1. [CSP-S模拟测试]:Star Way To Heaven(最小生成树Prim)

    题目描述 小$w$伤心的走上了$Star\ way\ to\ heaven$. 到天堂的道路是一个笛卡尔坐标系上一个$n\times m$的长方形通道(顶点在$(0,0)$和$(n,m)$),小$w$ ...

  2. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  3. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  4. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  5. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

  6. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  7. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  8. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  9. NOIP模拟测试1(2017081501)

    好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...

随机推荐

  1. python web自动化测试框架搭建(功能&接口)——接口用例实现

    测试用例基类: # coding=utf-8 import unittest import Logger log = Logger.Loger() class BaseCase(unittest.Te ...

  2. 《STL源码剖析》——第四章、序列容器

     1.容器的概观与分类 所谓序列式容器,其中的元素都可序(ordered)[比如可以使用sort进行排序],但未必有序(sorted).C++语言本身提供了一个序列式容器array,STL另外再提供v ...

  3. python的正则

    一.认识模块  什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是加上.py的后缀,但其实import加载的模块分为四个通用类别 : 1.使用python编写的代码(.py文件 ...

  4. JavaScript LinkedList

    function LinkedList() { var Node = function(element) { this.element = element; this.next = null } va ...

  5. [暑假集训Day4T3]曲线

    三分模板. 三分法求单峰函数最优值,之后每次取所有二次函数最优值即可 #pragma GCC optimize(3,"Ofast","inline") #inc ...

  6. web调试代理工具Whistle

    由于最近在学习微信小程序开发,项目中用到了https代理请求,所以用到了基于Node实现的跨平台web调试代理工具Whistle,在此做一记录. 完成https代理请求总共需要5个步骤. 一.安装No ...

  7. P1021 邮票面值设计(dfs+背包dp)

    P1021 邮票面值设计 题目传送门 题意: 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15N+K≤15)种邮票的情况下 (假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大 ...

  8. k8s应用配置详解

    1. 概述 k8s主要通过Object定义各种部署任务(例如:部署应用.部署Ingress路由规则.部署service等等),通过kubectl命令远程操作k8s集群. Object的定义通常以Yam ...

  9. 【freemarker】渲染列表一系列操作

    数据模型: public class AddressVo implements Serializable { private static final long serialVersionUID = ...

  10. C# 跨线程调用控件的4中方法

    原文:C# 跨线程调用控件 在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应.  同时我们又需要在工作线程中更新UI界面上的控件, 下面介绍几种常用的方法 阅读目录 线 ...