A
B

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) 的最短路径

	所以用最短路是正确的
*/
posted @ 2025-11-09 16:05  MyShiroko  阅读(17)  评论(0)    收藏  举报