Description
就
是
说
给
出
一
个
n
∗
m
的
地
形
块
,
0
表
示
海
平
面
,
负
数
表
示
地
面
在
海
水
下
,
正
数
表
示
是
陆
地
,
且
高
出
海
平
面
。
就是说给出一个n*m的地形块,0表示海平面,负数表示地面在海水下,正数表示是陆地,且高出海平面。
就是说给出一个n∗m的地形块,0表示海平面,负数表示地面在海水下,正数表示是陆地,且高出海平面。
现
在
在
(
x
,
y
)
处
放
上
一
个
排
水
的
设
备
,
问
其
能
排
出
多
少
的
水
,
对
于
一
个
位
置
,
水
能
够
从
八
个
方
向
进
来
。
现在在(x,y)处放上一个排水的设备,问其能排出多少的水,对于一个位置,水能够从八个方向进来。
现在在(x,y)处放上一个排水的设备,问其能排出多少的水,对于一个位置,水能够从八个方向进来。
Input
1
≤
h
,
w
≤
500
1\leq h,w\leq 500
1≤h,w≤500
0
≤
i
<
h
0\leq i < h
0≤i<h
0
≤
j
<
m
0\leq j< m
0≤j<m
Output
总的的排水量
Solution
水往低处流。
于是需要优先最低的,即水位最深的。
考
虑
j
→
i
的
水
流
量
=
m
i
n
(
d
e
p
i
,
d
e
p
j
)
d
e
p
是
离
海
平
面
的
距
离
。
考虑j \to i 的水流量 = min(dep_i,dep_j) dep是离海平面的距离。
考虑j→i的水流量=min(depi,depj)dep是离海平面的距离。
Codes
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 550;
struct Node{
int x,y;
ll val;
Node(){}
Node(int _x,int _y,ll _val) {x = _x;y = _y;val = _val;}
bool operator < (const Node &a)const {
return val < a.val;
}
};
priority_queue<Node> qu;
int n,m,maze[maxn][maxn];
bool vis[maxn][maxn];
int main()
{
while(~scanf("%d%d",&n,&m)) {
while(!qu.empty()) qu.pop();
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
scanf("%d",&maze[i][j]);
if(maze[i][j] >= 0) {
maze[i][j] = 0;
}
else {
maze[i][j] = -maze[i][j];
}
}
}
int x,y;
scanf("%d%d",&x,&y);x--;y--;
qu.push(Node(x,y,maze[x][y]));
vis[x][y] = true;
ll res = 0;
while(!qu.empty()) {
Node now = qu.top();qu.pop();
res += now.val;
for(int i=-1;i<=1;i++) for(int j=-1;j<=1;j++) {
int mx = now.x + i,my = now.y + j;
if(mx<0 || mx >= n || my<0 || my >= m || vis[mx][my] || maze[mx][my]==0) continue;
vis[mx][my] = 1;
// maze[mx][my] = min((ll)maze[mx][my],now.val);
qu.push(Node(mx,my,min(now.val,(ll)maze[mx][my])));
}
}
// for(int i=0;i<n;i++) {
// for(int j=0;j<m;j++) if(maze[i][j] && vis[i][j]) res += maze[i][j];
// }
printf("%lld\n",res);
}
return 0;
}