Submission #1181047

#TimeUsernameProblemLanguageResultExecution timeMemory
1181047miniobSoccer (JOI17_soccer)C++20
100 / 100
352 ms24908 KiB
#include <bits/stdc++.h>
using namespace std;

long long odl[507][507];
long long odl2[507][507][5];
long long dx[4];
long long dy[4];
long long h, w;

bool czyok(long long i, long long j)
{
	if(0 <= i && i <= h && 0 <= j && j <= w)
	{
		return true;
	}
	return false;
}

int main() 
{
	dx[0] = 1;
	dx[1] = -1;
	dy[2] = 1;
	dy[3] = -1;
	long long a, b, c, n;
	cin >> h >> w >> a >> b >> c >> n;
	for(long long i = 0; i <= h; i++)
	{
		for(long long j = 0; j <= w; j++)
		{
			for(long long k = 0; k < 5; k++)
			{
				odl2[i][j][k] = LLONG_MAX;
			}
			odl[i][j] = LLONG_MAX;
		}
	}
	vector<pair<long long, long long>> osoby;
	queue<pair<long long, long long>> q;
	for(long long i = 0; i < n; i++)
	{
		long long x, y;
		cin >> x >> y;
		osoby.push_back({x, y});
		q.push({x, y});
		odl[x][y] = 0;
	}
	while(!q.empty())
	{
		auto cur = q.front();
		q.pop();
		for(long long i = 0; i < 4; i++)
		{
			long long curx = cur.first + dx[i];
			long long cury = cur.second + dy[i];
			if(czyok(curx, cury) && odl[curx][cury] > odl[cur.first][cur.second] + 1)
			{
				odl[curx][cury] = odl[cur.first][cur.second] + 1;
				q.push({curx, cury});
			}
		}
	}
	priority_queue<pair<pair<long long, long long>, pair<long long, long long>>, vector<pair<pair<long long, long long>, pair<long long, long long>>>, greater<pair<pair<long long, long long>, pair<long long, long long>>>> pq;
	pq.push({{0, 0}, {osoby[0].first, osoby[0].second}});
	odl2[osoby[0].first][osoby[0].second][0] = 0;
	while(!pq.empty())
	{
		auto cur = pq.top();
		pq.pop();
		if(odl2[cur.second.first][cur.second.second][cur.first.second] < cur.first.first)
		{
			continue;
		}
		if(cur.first.second == 0)
		{
			for(long long i = 0; i < 4; i++)
			{
				long long i2, j;
				long long curodl = odl2[cur.second.first][cur.second.second][cur.first.second];
				i2 = cur.second.first;
				j = cur.second.second;
				/*if(i2 == 3 && j == 1)
				{
					cout << odl2[i2][j][i + 1] << endl;
				}*/
				if(odl2[i2][j][i + 1] > curodl + b)
				{
					odl2[i2][j][i + 1] = curodl + b;
					pq.push({{odl2[i2][j][i + 1], i + 1}, {i2, j}});
				}
				if(czyok(i2 + dx[i], j + dy[i]) && odl2[i2 + dx[i]][j + dy[i]][0] > curodl + c)
				{
					odl2[i2 + dx[i]][j + dy[i]][0] = curodl + c;
					pq.push({{odl2[i2 + dx[i]][j + dy[i]][0], 0}, {i2 + dx[i], j + dy[i]}});
				}
			}
		}
		else
		{
			long long curodl = odl2[cur.second.first][cur.second.second][cur.first.second];
			long long i, j, typ;
			i = cur.second.first;
			j = cur.second.second;
			typ = cur.first.second;
			/*if(i == 3 && j == 1 && typ == 4)
			{
				//cout << "tak" << endl;
				//cout << odl[i][j] << endl;
			}*/
			if(curodl + odl[i][j] * c < odl2[i][j][0])
			{
				odl2[i][j][0] = curodl + odl[i][j] * c;
				pq.push({{odl2[i][j][0], 0}, {i, j}});
			}
			if(czyok(i + dx[typ - 1], j + dy[typ - 1]) && odl2[i + dx[typ - 1]][j + dy[typ - 1]][typ] > curodl + a)
			{
				odl2[i + dx[typ - 1]][j + dy[typ - 1]][typ] = curodl + a;
				pq.push({{odl2[i + dx[typ - 1]][j + dy[typ - 1]][typ], typ}, {i + dx[typ - 1], j + dy[typ - 1]}});
			}
		}
	}
	/*for(long long i = 0; i <= h; i++)
	{
		for(long long j = 0; j <= w; j++)
		{
			cout << odl2[i][j][0] << " ";
		}
		cout << endl;
	}*/
	cout << odl2[osoby[n - 1].first][osoby[n - 1].second][0] << endl;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...