water

题目描述

有一块矩形土地被划分成\(n\times m\)个正方形小块。这些小块高低不平,每一小块都有自己的高度。水流可以由任意一块地流向周围四个方向的四块地中,但是不能直接流入对角相连的小块中。

一场大雨后,由于地势高低不同,许多地方都积存了不少降水。

给定每个小块的高度,求每个小块的积水高度。

注意:假设矩形地外围无限大且高度为\(0\)。

输入输出格式

输入格式

第一行包含两个非负整数\(n,m\)。

接下来\(n\)行每行\(m\)个整数表示第\(i\)行第\(j\)列的小块的高度。

输出格式

输出\(n\)行,每行\(m\)个由空格隔开的非负整数,表示每个小块的积水高度。

说明:

对于\(20\%\)的数据\(n,m\le 4\)

对于\(40\%\)的数据\(n,m\le 15\)

对于\(60\%\)的数据\(n,m\le 50\)

对于\(100\%\)的数据\(n,m\le 300\),|小块高度|\(\le 10^9\)。

在每一部分数据中,均有一半数据保证小块高度非负


有一种堆+遍历低点的做法,不太懂具体的复杂度,没写。

考虑一个点的边界最低点一定是从它出去到矩形外的每条四联通路径边权的最大值中的最小值。

把相邻两个块连边,权值为\(max \ height\)

这个东西可以把最小生成树求出来,然后就是询问树上两点间距离的最大值了。

发现有一个点是确定的,就是矩形外抽象的那个点。

为什么可以求最小生成树呢?其实货车运输那个题和这个差不多。

考虑某两个点有\(n\)条路径,现在把它们每条路径的最大值断开,这时候再保证联通,连上的就是最小的最大值了。


Code:

#include <cstdio>
#include <algorithm>
const int N=1e5;
int n,m,h[N],f[N],ans[N],tot;
int cal(int i,int j)
{
if(i==n+1||j==m+1||i==0||j==0) return 0;
return (i-1)*m+j;
}
struct node
{
int u,v,w;
bool friend operator <(node n1,node n2){return n1.w<n2.w;}
}e[N<<2];
int Next[N<<1],to[N<<1],edge[N<<1],head[N],cnt;
void add(int u,int v,int w)
{
to[++cnt]=v,edge[cnt]=w,Next[cnt]=head[u],head[u]=cnt;
}
int max(int x,int y){return x>y?x:y;}
int Find(int x){return f[x]=f[x]==x?x:Find(f[x]);}
void Merge(int x,int y){f[Find(x)]=Find(y);}
void krus()
{
for(int i=0;i<=m*n;i++) f[i]=i;
std::sort(e+1,e+1+tot);
for(int i=1;i<=tot;i++)
{
int u=e[i].u,v=e[i].v,w=e[i].w;
if(Find(u)!=Find(v)) Merge(u,v),add(u,v,w),add(v,u,w);
}
}
void dfs(int now,int fa)
{
for(int i=head[now];i;i=Next[i])
{
int v=to[i],w=edge[i];
if(v!=fa)
ans[v]=max(ans[now],w),dfs(v,now);
}
}
const int dx[5]={0,-1,0,1,0};
const int dy[5]={0,0,1,0,-1};
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",h+cal(i,j));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
int u=cal(i,j);
for(int k=1;k<=4;k++)
{
int v=cal(i+dx[k],j+dy[k]);
e[++tot]={u,v,max(h[u],h[v])};
}
}
krus();
dfs(0,0);
for(int i=1;i<=n*m;i++)
{
printf("%d ",ans[i]-h[i]);
if(i%m==0) printf("\n");
}
return 0;
}

2018.10.15

water 解题报告的更多相关文章

  1. [LeetCode]Container With Most Water, 解题报告

    前言 难怪LeetCode OJ在找工作时被很多人推荐,发现了这道最大蓄水题目就是美团的笔试最后一道题,当时我霸笔只有着一道题目没有答出来,因此也就没有获得面试机会,可惜了 题目 Given n no ...

  2. LeetCode: Trapping Rain Water 解题报告

    https://oj.leetcode.com/problems/trapping-rain-water/ Trapping Rain WaterGiven n non-negative intege ...

  3. CYJian的水题大赛2 解题报告

    这场比赛是前几天洛谷上 暮雪﹃紛紛dalao的个人公开赛,当时基本上都在水暴力分......也没有好好写正解(可能除了T1) 过了几天颓废的日子之后,本蒟蒻觉得应该卓越一下了qwq,所以就打算写一个解 ...

  4. 【LeetCode】Island Perimeter 解题报告

    [LeetCode]Island Perimeter 解题报告 [LeetCode] https://leetcode.com/problems/island-perimeter/ Total Acc ...

  5. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  6. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  7. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  8. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  9. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

随机推荐

  1. php file_exists中文路径不存在问题

    php的file_exists函数使用中文路径,会显示文件不存在,即使文件已经存在了也会报这个错. 解决方法: <?php $file_name='D://360极速浏览器下载//a.txt'; ...

  2. Table被web编程弃用的原因

    Table要比其它html标记占更多的字节. (延迟下载时间,占用服务器更多的流量资源.)Tablle会阻挡浏览器渲染引擎的渲染顺序. (会延迟页面的生成速度,让用户等待更久的时间.)Table里显示 ...

  3. ATM购物车程序项目规范(更新到高级版)

    ATM购物车程序(高级版) 之前的低级版本已经删除,现在的内容太多,没时间把内容上传,有时间我会把项目源码奉上! 我已经把整个项目源码传到群文件里了,需要的可以加主页qq群号.同时群内也有免费的学习资 ...

  4. Infinite Maze CodeForces - 196B

    We've got a rectangular n × m-cell maze. Each cell is either passable, or is a wall (impassable). A ...

  5. P3305 [SDOI2013]费用流

    题目描述 Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量. 一个合法的网络流方案必须满足: ...

  6. 牛客暑假多校第六场I-Team Rocket

    一.题意 我们是穿越银河的火箭队....... 给出若干个区间,之后给出若干个点,要求对每个点求出,第一个覆盖点的区间的数量,之后用当前所有点覆盖的区间的序号的乘积结合输入的Y来生成下一位点.最后输出 ...

  7. 关于PHP性能提升踩过的一些坑

        性能这个东西,在网站规模到达一定程度后,会是一个永恒的主题.关于这方面,本人有一些拙见,现在拿出来,大家一起探讨下.     1.编码过程中,传递参数时,尽量少使用‘引用传参’.这是一个巨坑啊 ...

  8. 图表制作工具之ECharts

    简介 ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器(IE6/7/8/9/10 ...

  9. IdFTP中FEAT命令的问题

    IdFTP控件很方便开发FTP客户端,用于传输文件.一次笔者的一个在阿里云的服务器突发故障,显示无法登陆FTP,而使用其他客户端(如FlashFxp)经过该项目设置,又可正常使用. 查询后说是FEAT ...

  10. 1176: [Balkan2007]Mokia

    1176: [Balkan2007]Mokia 链接 分析 三维偏序问题,CDQ分治论文题. 代码 #include<bits/stdc++.h> using namespace std; ...