Submission #532865

#TimeUsernameProblemLanguageResultExecution timeMemory
532865rk42745417Soccer (JOI17_soccer)C++17
100 / 100
568 ms26868 KiB
#include <bits/stdc++.h>
using namespace std;

#define EmiliaMyWife ios::sync_with_stdio(0); cin.tie(0);
using ll = int64_t;
using ull = uint64_t;
using uint = uint32_t;
using ld = long double;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const ll LINF = ll(4e18) + ll(2e15);
const double EPS = 1e-9;
static int LamyIsCute = []() {
	EmiliaMyWife
	return 48763;
}();

const int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};

signed main() {
	int h, w;
	cin >> h >> w;
	auto check = [&](int a, int b) {
		return a >= 0 && a <= h && b >= 0 && b <= w;
	};

	ll a, b, c;
	cin >> a >> b >> c;
	int n;
	cin >> n;
	vector<pair<int, int>> arr(n);
	for(int i = 0; i < n; i++)
		cin >> arr[i].first >> arr[i].second;

	vector<vector<int>> dis(h + 1, vector<int>(w + 1, INF));
	for(const auto &[x, y] : arr)
		dis[x][y] = 0;
	queue<pair<int, int>> bfs;
	for(int i = 0; i <= h; i++)
		for(int j = 0; j <= w; j++)
			if(dis[i][j] == 0)
				bfs.push({i, j});
	while(!bfs.empty()) {
		auto [u, v] = bfs.front();
		bfs.pop();
		for(int i = 0; i < 4; i++) {
			int x = u + dx[i], y = v + dy[i];
			if(check(x, y) && dis[x][y] > dis[u][v] + 1)
				dis[x][y] = dis[u][v] + 1, bfs.push({x, y});
		}
	}

	vector<vector<vector<ll>>> ans(h + 1, vector<vector<ll>>(w + 1, vector<ll>(5, LINF)));
	ans[arr[0].first][arr[0].second][0] = 0;
	priority_queue<tuple<ll, int, int, int>, vector<tuple<ll, int, int, int>>, greater<tuple<ll, int, int, int>>> pq;
	pq.push({0, arr[0].first, arr[0].second, 0});
	while(!pq.empty()) {
		auto [d, u, v, w] = pq.top();
		pq.pop();
		if(d > ans[u][v][w])
			continue;
		ll cost = 0;
		if(w == 0) {
			for(int i = 1; i <= 4; i++) {
				if(ans[u][v][i] > ans[u][v][w] + b) {
					ans[u][v][i] = ans[u][v][w] + b;
					pq.push({ans[u][v][i], u, v, i});
				}
			}
			cost = c;
		}
		else {
			if(ans[u][v][0] > ans[u][v][w] + c * dis[u][v]) {
				ans[u][v][0] = ans[u][v][w] + c * dis[u][v];
				pq.push({ans[u][v][0], u, v, 0});
			}
			cost = a;
		}
		for(int i = 0; i < 4; i++) {
			int x = u + dx[i], y = v + dy[i];
			if((w == 0 || i + 1 == w) && check(x, y) && ans[x][y][w] > d + cost) {
				ans[x][y][w] = d + cost;
				pq.push({ans[x][y][w], x, y, w});
			}
		}
	}

	ll ret = LINF;
	for(int i = 0; i <= h; i++)
		for(int j = 0; j <= w; j++)
			for(int k = 0; k < 2; k++)
				ret = min(ret, ans[i][j][k] + c * (abs(i - arr[n - 1].first) + abs(j - arr[n - 1].second)));
	cout << ret << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...