Submission #332179

#TimeUsernameProblemLanguageResultExecution timeMemory
332179arnold518Soccer (JOI17_soccer)C++14
100 / 100
1744 ms39364 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXH = 500;
const int MAXN = 1e5;
const ll INF = 1e18;

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

int H, W, N;
ll A, B, C;
pii P[MAXN+10];

ll D[MAXH+10][MAXH+10];
ll dist[MAXH+10][MAXH+10][5];

struct Queue
{
	int y, x, k; ll w;
	bool operator < (const Queue &p) const
	{
		return w>p.w;
	}
};

int main()
{
	scanf("%d%d", &H, &W);
	scanf("%lld%lld%lld", &A, &B, &C);
	scanf("%d", &N);
	for(int i=1; i<=N; i++) scanf("%d%d", &P[i].first, &P[i].second);

	queue<pii> Q;
	for(int i=0; i<=H; i++) for(int j=0; j<=W; j++) D[i][j]=INF;
	for(int i=1; i<=N; i++)
	{
		Q.push({P[i].first, P[i].second});
		D[P[i].first][P[i].second]=0;
	}
	while(!Q.empty())
	{
		pii now=Q.front(); Q.pop();
		for(int i=0; i<4; i++)
		{
			int ny=now.first+dy[i], nx=now.second+dx[i];
			if(!(0<=ny && ny<=H && 0<=nx && nx<=W)) continue;
			if(D[ny][nx]!=INF) continue;
			D[ny][nx]=D[now.first][now.second]+1;
			Q.push({ny, nx});
		}
	}

	priority_queue<Queue> PQ;
	PQ.push({P[1].first, P[1].second, 4, 0});

	for(int i=0; i<=H; i++) for(int j=0; j<=W; j++) for(int k=0; k<5; k++) dist[i][j][k]=INF;

	while(!PQ.empty())
	{
		Queue now=PQ.top(); PQ.pop();
		if(dist[now.y][now.x][now.k]<=now.w) continue;
		dist[now.y][now.x][now.k]=now.w;

		if(now.k==4)
		{
			for(int i=0; i<4; i++)
			{
				int ny=now.y+dy[i], nx=now.x+dx[i];
				if(!(0<=ny && ny<=H && 0<=nx && nx<=W)) continue;
				PQ.push({ny, nx, 4, now.w+C});
				PQ.push({ny, nx, i, now.w+A+B});
			}
		}
		else
		{
			int ny=now.y+dy[now.k], nx=now.x+dx[now.k];
			if(D[now.y][now.x]!=INF) PQ.push({now.y, now.x, 4, now.w+D[now.y][now.x]*C});
			if(!(0<=ny && ny<=H && 0<=nx && nx<=W)) continue;
			PQ.push({ny, nx, now.k, now.w+A});
		}
	}

	ll ans=INF;
	for(int i=0; i<5; i++) ans=min(ans, dist[P[N].first][P[N].second][i]);
	printf("%lld\n", ans);
}

Compilation message (stderr)

soccer.cpp: In function 'int main()':
soccer.cpp:33:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   33 |  scanf("%d%d", &H, &W);
      |  ~~~~~^~~~~~~~~~~~~~~~
soccer.cpp:34:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   34 |  scanf("%lld%lld%lld", &A, &B, &C);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
soccer.cpp:35:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   35 |  scanf("%d", &N);
      |  ~~~~~^~~~~~~~~~
soccer.cpp:36:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   36 |  for(int i=1; i<=N; i++) scanf("%d%d", &P[i].first, &P[i].second);
      |                          ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...