U629961 焦头烂额的日奈委员长 の markdown
U629961 焦头烂额的日奈委员长
题目背景
由于美食研究部的众人绑架了枫香,所以今天的歌赫娜由朱莉提供。
但是由于某些众所周知的原因,今天的午饭不仅无法正常开饭,为师的大可爱还需要处理这些活蹦乱跳冒着绿色粘液的午饭,将枫香救出来!
题目描述
为师的日奈大可爱需要在的 \(n \times m\) 的歌赫娜餐厅中围剿这些活蹦乱跳的午饭,她现在在餐厅的 \((x_1,y_1)\) 处,但由于其重量太大且移动速度极其缓慢,因此将其看作不动的点,则 \(a_{i,j} > 0\),其余点则没有这些午餐,则 \(a_{i,j} = 0\)。
为师的日奈大可爱聪明精干,跑一格只需要一个单位时间,收拾一份午饭只需要 \(a_{i,j}\) 单位个时间。
难缠的午饭会在日奈收拾过离开后便会恢复。
现在美食研究会的晴奈等人将枫香放置在某个没有午餐的点 \((hx,hy)\) 上,由泉把守,使得枫香无法移动。
已知,日奈在到达枫香的位置后便能将她救下(无需消耗额外时间,即日奈到达枫香所在格后枫香下一时刻便可以自行走路),但是日奈会选择追击美食研究会等人,所以之后的路需要枫香自己走。
枫香跑一格需要一个单位时间,且无力清理午饭,她需要自行跑到 \((x_2,y_2)\) 处坐上伊吕波的虎丸号撤离。
设日奈出发的时刻为 \(0\)。
本题求枫香最快在哪一个时刻 \(t\) 能够坐上虎丸号撤离。
输入格式
共 \(n + 4\) 行。
第一行,两个正整数 \(n,m\)。
第二行,两个正整数 \(x_1,y_1\)。
第三行,两个正整数 \(x_2,y_2\)。
第四行,两个正整数 \(hx,hy\)。
接下来 \(n\) 行,每行 \(m\) 个正整数,每个数是 \(a_{i,j}\)。
输出格式
共一行。
输出一个正整数 \(t\)。
输入输出样例 #1
输入 #1
5 5
1 2
5 4
1 4
0 0 10 0 10
10 0 1 0 10
10 0 10 0 0
10 0 10 10 0
10 0 0 0 0
输出 #1
11
说明/提示
对于 \(100\%\) 的数据。
\(n,m \le 1 \times 10 ^3\)。
\(1 \le x_1,x_2,hx \le n\)。
\(1 \le y_1,y_2,hy \le m\)。
\(0 \le a_{i,j} \le 1 \times 10 ^ 9\)。
# U629961 焦头烂额的日奈委员长
## 题目背景
由于美食研究部的众人绑架了枫香,所以今天的歌赫娜由朱莉提供。
但是由于某些众所周知的原因,今天的午饭不仅无法正常开饭,为师的大可爱还需要处理这些活蹦乱跳冒着绿色粘液的午饭,将枫香救出来!
## 题目描述
为师的日奈大可爱需要在的 $n \times m$ 的歌赫娜餐厅中围剿这些活蹦乱跳的午饭,**她现在在餐厅的 $(x_1,y_1)$ 处**,但由于其重量太大且移动速度极其缓慢,因此将其看作不动的点,则 $a_{i,j} > 0$,其余点则没有这些午餐,则 $a_{i,j} = 0$。
为师的日奈大可爱聪明精干,**跑一格只需要一个单位时间,收拾一份午饭只需要 $a_{i,j}$ 单位个时间**。
难缠的午饭会在日奈收拾过离开后便会恢复。
现在美食研究会的晴奈等人将枫香放置在某个没有午餐的点 $(hx,hy)$ 上,由泉把守,使得**枫香无法移动**。
已知,**日奈在到达枫香的位置后便能将她救下(无需消耗额外时间,即日奈到达枫香所在格后枫香下一时刻便可以自行走路)**,但是日奈会选择追击美食研究会等人,所以之后的路需要枫香自己走。
**枫香跑一格需要一个单位时间**,且无力清理午饭,她需要自行跑到 $(x_2,y_2)$ 处坐上伊吕波的虎丸号撤离。
设日奈出发的时刻为 $0$。
本题求枫香最快在哪一个时刻 $t$ 能够坐上虎丸号撤离。
## 输入格式
共 $n + 4$ 行。
第一行,两个正整数 $n,m$。
第二行,两个正整数 $x_1,y_1$。
第三行,两个正整数 $x_2,y_2$。
第四行,两个正整数 $hx,hy$。
接下来 $n$ 行,每行 $m$ 个正整数,每个数是 $a_{i,j}$。
## 输出格式
共一行。
输出一个正整数 $t$。
## 输入输出样例 #1
### 输入 #1
5 5
1 2
5 4
1 4
0 0 10 0 10
10 0 1 0 10
10 0 10 0 0
10 0 10 10 0
10 0 0 0 0
### 输出 #1
11
## 说明/提示
对于 $100\%$ 的数据。
$n,m \le 1 \times 10 ^3$。
$1 \le x_1,x_2,hx \le n$。
$1 \le y_1,y_2,hy \le m$。
$0 \le a_{i,j} \le 1 \times 10 ^ 9$。
#include<bits/stdc++.h>
#define yes(x,l,r) (l <= x && x <= r)
#define int long long
#define Blue_Archive return 0
#define con putchar_unlocked(' ')
#define ent putchar_unlocked('\n')
using namespace std;
constexpr int N = 1e3 + 7;
constexpr int INF = 1e9;
constexpr int fx[5] = {0,-1,1,0,0};
constexpr int fy[5] = {0,0,0,-1,1};
int n;
int m;
int x;
int y;
int x2;
int y2;
int hx;
int hy;
int ans;
int a[N][N];
int dis[N][N];
bool vis[N][N];
struct miku
{
int x,y;
int val;
friend bool operator< (miku a,miku b){return a.val < b.val;}
friend bool operator> (miku a,miku b){return a.val > b.val;}
};
priority_queue<miku,vector<miku>,greater<miku>> pq;
queue<pair<int,int>> q;
inline int read()
{
int x = 0,f = 1;
int c = getchar_unlocked();
while(c < '0' || c > '9') f = (c == '-' ? -1 : f),c = getchar_unlocked();
while(c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48),c = getchar_unlocked();
return x * f;
}
inline void write(int x)
{
if(x < 0) putchar_unlocked('-'),x = -x;
if(x > 9) write(x / 10);
putchar_unlocked(x % 10 + '0');
}
inline void dijk(int sx,int sy)
{
memset(dis,0x3f,sizeof(dis));
dis[sx][sy] = 0;
pq.push({sx,sy,dis[sx][sy]});
while(!pq.empty())
{
miku u = pq.top();
pq.pop();
if(vis[u.x][u.y]) continue;
vis[u.x][u.y] = 1;
for(int i = 1;i <= 4;i ++)
{
if(yes(u.x + fx[i],1,n) && yes(u.y + fy[i],1,m))
{
if(dis[u.x + fx[i]][u.y + fy[i]] > dis[u.x][u.y] + a[u.x + fx[i]][u.y + fy[i]] + 1)
{
dis[u.x + fx[i]][u.y + fy[i]] = dis[u.x][u.y] + a[u.x + fx[i]][u.y + fy[i]] + 1;
pq.push({u.x + fx[i],u.y + fy[i],dis[u.x + fx[i]][u.y + fy[i]]});
}
}
}
}
}
inline void bfs(int sx,int sy)
{
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
q.push({sx,sy});
dis[sx][sy] = 0;
while(!q.empty())
{
pair<int,int> op = q.front();
q.pop();
if(vis[op.first][op.second]) continue;
vis[op.first][op.second] = 1;
for(int i = 1;i <= 4;i ++)
{
if(yes(op.first + fx[i],1,n) && yes(op.second + fy[i],1,m) && !a[op.first + fx[i]][op.second + fy[i]] && dis[op.first + fx[i]][op.second + fy[i]] >= INF)
{
dis[op.first + fx[i]][op.second + fy[i]] = dis[op.first][op.second] + 1;
q.push({op.first + fx[i],op.second + fy[i]});
}
}
}
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("data.in","r",stdin);freopen("data.out","w",stdout);
#endif
n = read();
m = read();
x = read();
y = read();
x2 = read();
y2 = read();
hx = read();
hy = read();
for(int i = 1;i <= n;i ++)
{
for(int j = 1;j <= m;j ++)
{
a[i][j] = read();
}
}
dijk(x,y);
ans += dis[hx][hy];
bfs(hx,hy);
ans += dis[x2][y2];
write(ans);ent;
Blue_Archive;
}
/*
注意到砸墙的代价与走路的代价本质上并无区别。
通过砸墙的代价可以理解为 $w = a[i][j] + 1$
走路的贡献相当于 $w = 1$。
这样我们就把第一部分的答案转化为在一个边权为 $w$ 的图上跑一个单源最短路。
1 2 3 4
1 1 <1- 0 -11> 11 -1> 5
| | | /\
11 1 2 1
\/ \/ \/ |
2 12 -1> 1 -2> 3 -1> 4
这样我们就求出了从 (1,2) 到 (4,2) 的最短路径
所以用最短路是正确的
*/

浙公网安备 33010602011771号