Submission #681914

#TimeUsernameProblemLanguageResultExecution timeMemory
681914KahouSoccer (JOI17_soccer)C++14
100 / 100
681 ms30932 KiB
#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define endl '\n'
#define mk make_pair
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const ll inf = 1e18 + 50;
const int N = 550, M = 1e5 + 50;
ll n, h, w, A, B, C;
pll P[M];
ll dis[N][N][6], bdis[N][N];
queue<pll> q;
set<pll> st;
int dx[] = {0, 1, 0,-1};
int dy[] = {1, 0,-1, 0};


inline ll f(int x, int y, int c) {
	return x*N*6 + y*6 + c;
}

bool val(int x, int y) {
	return x >= 0 && x <= h && y >= 0 && y <= w;
}

void solve() {
	cin >> h >> w;
	cin >> A >> B >> C;
	cin >> n;
	for (int x = 0; x <= h; x++) {
		for (int y = 0; y <= w; y++) {
			bdis[x][y] = inf;
			for (int c = 0; c < 6; c++) {
				dis[x][y][c] = inf;
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		cin >> P[i].F >> P[i].S;
		if (i < n) {
			bdis[P[i].F][P[i].S] = 0;
			q.push(P[i]);
		}
	}

	if (n == 1) {
		cout << 0 << endl;
		return;
	}

	while (q.size()) {
		int x = q.front().F, y = q.front().S;
		q.pop();
		for (int i = 0; i < 4; i++) {
			if (val(x+dx[i], y+dy[i]) && bdis[x][y]+C < bdis[x+dx[i]][y+dy[i]]) {
				bdis[x+dx[i]][y+dy[i]] = bdis[x][y]+C;
				q.push({x+dx[i], y+dy[i]});
			}
		}
	}
	dis[P[1].F][P[1].S][5] = 0;
	st.insert({0, f(P[1].F, P[1].S, 5)});
	while (st.size()) {
		ll x = st.begin()->S/(N*6), y = (st.begin()->S/6)%N, c = (st.begin()->S%6);
		st.erase(st.begin());
		if (c == 0) {
			if (dis[x][y][0] + bdis[x][y] < dis[x][y][5]) {
				st.erase({dis[x][y][5], f(x, y, 5)});
				dis[x][y][5] = dis[x][y][0] + bdis[x][y];
				st.insert({dis[x][y][5], f(x, y, 5)});
			}
		}
		else if (c == 5) {
			if (dis[x][y][5] < dis[x][y][0]) {
				st.erase({dis[x][y][0], f(x, y, 0)});
				dis[x][y][0] = dis[x][y][5];
				st.insert({dis[x][y][0], f(x, y, 0)});
			}
			for (int i = 0; i < 4; i++) {
				if (dis[x][y][5] + B < dis[x][y][i+1]) {
					st.erase({dis[x][y][i+1], f(x, y, i+1)});
					dis[x][y][i+1] = dis[x][y][5] + B;
					st.insert({dis[x][y][i+1], f(x, y, i+1)});
				}
				ll xp = x+dx[i], yp = y+dy[i];
				if (!val(xp, yp)) continue;
				if (dis[x][y][5] + C < dis[xp][yp][5]) {
					st.erase({dis[xp][yp][5], f(xp, yp, 5)});
					dis[xp][yp][5] = dis[x][y][5] + C;
					st.insert({dis[xp][yp][5], f(xp, yp, 5)});
				}
			}
		}
		else {
			if (dis[x][y][c] < dis[x][y][0]) {
				st.erase({dis[x][y][0], f(x, y, 0)});
				dis[x][y][0] = dis[x][y][c];
				st.insert({dis[x][y][0], f(x, y, 0)});
			}
			ll xp = x+dx[c-1], yp = y+dy[c-1];
			if (!val(xp, yp)) continue;
			if (dis[x][y][c] + A < dis[xp][yp][c]) {
				st.erase({dis[xp][yp][c], f(xp, yp, c)});
				dis[xp][yp][c] = dis[x][y][c] + A;
				st.insert({dis[xp][yp][c], f(xp, yp, c)});
			}
		}
	}
	cout << dis[P[n].F][P[n].S][0] << endl;
}
int main() {
	ios::sync_with_stdio(0), cin.tie(0);
	solve();
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...