NOIP 模拟赛 day5 T2 水 故事题解
题目描述
有一块矩形土地被划分成 \(\small n×m\) 个正方形小块。这些小块高低不平,每一小块都有自己的高度。水流可以由任意一块地流向周围四个方向的四块地中,但是不能直接流入对角相连的小块中。
一场大雨后,由于地势高低不同,许多地方都积存了不少降水。假如你已经知道这块土地的详细信息,你能求出每个小块的积水高度吗?
注意:假设矩形地外围的高度为 \(\small 0\) 。
\(\small1\leq n,m\leq 300 ,-10^9\leq h\leq 10^9\)
solution
实际上最一开始思路本来是从围墙开始向里遍历,用队列维护。
后来发现随便一个数据就能卡掉,于是就换成了小根堆维护。
然后又造了一个数据卡掉,加了一个小细节,加点的时候和原来的点权值取max,然后就可以过了。。
于是我尝试去口胡这道题的题解:
故事开始了
这是一个属于水的世界。
你叫水王,是整个世界的主:海王的得力部下。
有这么一天,你犯下了弥天大错,海王为了惩罚你,将你贬为水鬼,取消了你天水撒花的能力,并把你发配到了一片高低不平的土地上。
海王要知道这里下了水后,每一块地方落了多高的水,并让你从外面的水平面上开始计算。
幸好,他没有夺走你召唤单位量的水和在水上行走的能力,你开始了。
哦,你还有个毛病,你虽然不像水,你能上能下,但你只想往下走,不行的话再走平路,再不行才会向上走,并且你不会在一块地方上走两遍。
你在外面绕了一圈,会找到两大类地方,不比水平面低的,暂时不动;比水平面低的,马上开始走,并召唤相应的单位量水填平(就当它真的这么高了),顺便记录下来,然后继续向里面找,直到周围全都比你高了,就继续回到外面找。
这样一圈下来,你可能走成这样了。(黑色是走过的)

所以说就相当于沿黑色块内部又是一圈,你就会找到这一圈里面最矮的地方爬上去,绕着继续重复找。
最后你能保证所有点都走过一遍了,但怎么保证答案都是对的呢。
你陷入了沉思。。
因为搜到的前面的点已经填过水了,所以里面的只是找到这个点而已,填到多高,之前就已经知道了。
于是你在大约 \(\small O(nm\log{(nm)})\) 左右的时间搞定了
海王特别高兴,又把你恢复成水王了。
故事结束了
( 故事讲得不好,细节体现不全/kk )
看看代码吧(码风清奇,绝对好理解)
#include<bits/stdc++.h>
#define reg register
using namespace std;
typedef long long ll;
const int xx[]={0,0,1,-1};
const int yy[]={1,-1,0,0};
const int N=3e2+10;
int n,m;
ll a[N][N],ans[N][N];
bool vis[N][N];
struct mdzz{
int x,y;ll val;
bool operator < (const mdzz &b) const {
return val>b.val;
}
};
priority_queue<mdzz> q;
inline ll imax(ll a,ll b){
return a>b?a:b;
}
inline ll read(){
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
inline void BFS(){
while(!q.empty()){
mdzz u=q.top(),v;q.pop();
for(int i=0;i<4;++i){
v.x=u.x+xx[i];
v.y=u.y+yy[i];
if(v.x<1||v.x>n||v.y<1||v.y>m||vis[v.x][v.y])continue;
v.val=a[v.x][v.y];
vis[v.x][v.y]=1;
if(v.val<u.val){
ans[v.x][v.y]=u.val-v.val;
}
q.push({v.x,v.y,imax(u.val,v.val)});
}
}
}
int main(){
//freopen("water.in","r",stdin);
//freopen("water.out","w",stdout);
n=read();m=read();
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
a[i][j]=read();
}
q.push({0,i,0ll});
q.push({n+1,i,0ll});
}
for(int j=1;j<=m;++j){
q.push({j,0,0ll});
q.push({j,m+1,0ll});
}
BFS();
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
printf("%lld ",ans[i][j]);
}
printf("\n");
}
return 0;
}
(难得考场过题呀)
NOIP 模拟赛 day5 T2 水 故事题解的更多相关文章
- 【noip 模拟赛curse,light,maze】 题解
2018.10.16 总结:考的不好 原因: 1.考的时候没状态,读题读不进去 2.考的时候不仔细,该得分没得到 T1:curse 1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到 ...
- 俄罗斯方块(NOIP模拟赛)(水·模拟)
真是一道神奇的题目233~ 原题传送门 迫不得已贴了个题解的链接.. 好吧,这道题就是分情况讨论,纯模拟,, 没有什么难的.. 脑洞要大,四面都要考虑,不能漏! #include<iostrea ...
- 【noip模拟赛 王强的疑惑】 题解
考试题. 是个DP. 50分可以通过子集枚举+线段覆盖(贪心)完成. 考试没时间写了一个子集枚举30分. #include <cstdio> #include <cstring> ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...
- CH Round #48 - Streaming #3 (NOIP模拟赛Day1)
A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...
- CH Round #55 - Streaming #6 (NOIP模拟赛day2)
A.九九归一 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20(NOIP模拟赛day2)/九九归一 题 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
随机推荐
- 【pytest】使用parametrize将参数化变量传递到fixture
分享一个关于在pytest中,如何将测试用例文件中的变量传递到fixture函数. 一.交代应用场景 目前组内的项目,在根目录下是有一个conftest.py文件的,这里有个生成api token的f ...
- 基于雪花算法生成分布式ID(Java版)
SnowFlake算法原理介绍 在分布式系统中会将一个业务的系统部署到多台服务器上,用户随机访问其中一台,而之所以引入分布式系统就是为了让整个系统能够承载更大的访问量.诸如订单号这些我们需要它是全局唯 ...
- 开放式神经网络交换-ONNX(上)
目的 本文档包含ONNX语义的规范性规范. "onnx"文件夹下的.proto和.proto3文件构成了用协议缓冲区定义语言编写的语法规范..proto和.proto3文件中的注释 ...
- redis分布式锁扣减库存弊端: 吞吐量低, 解决方法:使用 分段锁 分布式分段锁并发扣减库存--代码实现
package tech.codestory.zookeeper.aalvcai.ConcurrentHashMapLock; import lombok.AllArgsConstructor; im ...
- SpringBoot面试题 (史上最全、持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- 【dp】10-8题解 vacation
vacations 原题codeforeces round 363 (Div2) c 题目描述 暑假到了, Pb 正在计划他的假期. Pb 准备假期去体育馆锻炼或看电影.但体育馆和电影院都有可能当天不 ...
- ANDROID开发之OOM:一张图片(BitMap)占用内存的计算 图片内存优化
Android中一张图片(BitMap)占用的内存主要和以下几个因数有关:图片长度,图片宽度,单位像素占用的字节数. 一张图片(BitMap)占用的内存=图片长度*图片宽度*单位像素占用的字节数 注: ...
- 面试侃集合 | DelayQueue篇
面试官:好久不见啊,上次我们聊完了PriorityBlockingQueue,今天我们再来聊聊和它相关的DelayQueue吧. Hydra:就知道你前面肯定给我挖了坑,DelayQueue也是一个无 ...
- 使用 TypeScript,React,ANTLR 和 Monaco Editor 创建一个自定义 Web 编辑器(二)
译文来源 欢迎阅读如何使用 TypeScript, React, ANTLR4, Monaco Editor 创建一个自定义 Web 编辑器系列的第二章节, 在这之前建议您阅读使用 TypeScrip ...
- centos使用yum安装docker
1.先决条件 要安装 Docker 引擎,您需要 CentOS 7 或 8 的维护版本.不支持或测试存档版本. 该centos-extras库必须启用.默认情况下启用此存储库,但如果您已禁用它,则需要 ...