1. 程式人生 > 實用技巧 >water

water

water ( \(\star\star \))

  • 時限:\(1s\) 記憶體:\(256M\)

Descrption

  • 有一塊矩形土地被劃分成 \(n*m\) 個正方形小塊。這些小塊高低不平,每一小塊都有自己的高度。水流可以由任意一塊地流向周圍四個方向的四塊地中,但是不能直接流入對角相連的小塊中。
  • 一場大雨後,由於地勢高低不同,許多地方都積存了不少降水。給定每個小塊的高度,求每個小塊的積水高度。
  • 注意:假設矩形地外圍無限大且高度為 \(0\)

Input

  • 第一行包含兩個非負整數\(n,m\)
  • 接下來\(n\) 行每行\(m\) 個整數表示第\(i\) 行第\(j\) 列的小塊的高度。

Output

  • 輸出 \(n\) 行,每行\(m\) 個由空格隔開的非負整數,表示每個小塊的積水高度。

Sample Input

3 3
4 4 0
2 1 3
3 3 -1

Sample Output

0 0 0
0 1 0
0 0 1

Hint

  • 對於20%的資料 \(n,m<=4\)
  • 對於40%的資料 \(n,m<=15\)
  • 對於60%的資料 \(n,m<=50\)
  • 對於100%的資料 \(n,m<=300\),|小塊高度|\(<=10^9\)
  • 在每一部分資料中,均有一半資料保證小塊高度非負
  • 來源:

分析

  • 外圍無限,且高度為 \(0\),所以高度為負的至少能夠裝水到地平,首先能確定儲水量的是矩形的四邊上的點,對於其他的點就不好直接判斷了,但根據水桶原理,能儲多少水取決於最短的那塊木板,所以我們可以把四邊上的每一個點放到一個小根堆裡,依次從高度最低的點往裡搜,顯然比他高的點是存不了水的,比他低的點可以儲存他們高度差的水量,依次搜尋即可。