제출 #535467

#제출 시각아이디문제언어결과실행 시간메모리
535467amunduzbaevSoccer (JOI17_soccer)C++17
100 / 100
2079 ms11680 KiB
#include "bits/stdc++.h"
using namespace std;
 
#define ar array
#define int long long

const int M = 1e5 + 5;
const int N = 505;
int _d[N][N], used[N][N];
int d[N][N][2], x[M], y[M];
int mn[N], p[N];

signed main(){
	ios::sync_with_stdio(0); cin.tie(0);
	
	int n, m; cin>>n>>m; n++, m++;
	int a, b, c; cin>>a>>b>>c;
	int k; cin>>k;
	memset(d, 63, sizeof d);
	queue<int> q;
	
	for(int i=0;i<k;i++){
		cin>>x[i]>>y[i];
		if(i+1 < k){
			used[x[i]][y[i]] = 1;
			q.push(x[i] * m + y[i]);
		}
	}
	
	int ch[4][2] = {
		{0, 1},
		{0, -1},
		{1, 0},
		{-1, 0}
	};
	auto check = [&](int x, int y){ return (0 <= x && x < n && 0 <= y && y < m); };
	while(!q.empty()){
		int u = q.front(); q.pop();
		int i = u/m, j = u%m;
		for(int t=0;t<4;t++){
			int x = i + ch[t][0], y = j + ch[t][1];
			if(check(x, y) && !used[x][y]){
				_d[x][y] = _d[i][j] + 1;
				used[x][y] = 1;
				q.push(x * m + y);
			}
		}
	}
	
	//~ for(int i=0;i<n;i++){
		//~ for(int j=0;j<m;j++){
			//~ cout<<_d[i][j]<<" ";
		//~ } cout<<"\n";
	//~ } cout<<"\n";
		
	memset(used, 0, sizeof used);
	memset(mn, 63, sizeof mn);
	memset(p, -1, sizeof p);
	int i = x[0], j = y[0];
	used[i][j] = 1;
	d[i][j][1] = d[i][j][0] = 0;
	
	auto print = [&](){
		for(int t=0;t<2;t++){
			for(int i=0;i<n;i++){
				for(int j=0;j<m;j++){
					cout<<d[i][j][t]<<" ";
				} cout<<"\n";
			} cout<<"\n";
		}
	};
	
	while(~j){
		//~ for(int i=0;i<=n;i++) cout<<mn[i]<<" "<<p[i]<<"\n";
		//~ cout<<"\n";
		auto upd = [&](int i, int j){
			if(mn[i] > d[i][j][1]){
				mn[i] = d[i][j][1];
				p[i] = j;
			}
		};
		
		for(int l=0;l<m;l++){
			int D = d[i][j][1] + abs(l - j) * a + b;
			d[i][l][0] = min(d[i][l][0], D);
			
			if(d[i][l][1] > D + _d[i][l] * c){
				d[i][l][1] = D + _d[i][l] * c;
				upd(i, l);
			}
		} for(int l=0;l<n;l++){
			int D = d[i][j][1] + abs(i - l) * a + b;
			d[l][j][0] = min(d[l][j][0], D);
			
			if(d[l][j][1] > D + _d[l][j] * c){
				d[l][j][1] = D + _d[l][j] * c;
				upd(l, j);
			}
		}
		for(int t=0;t<4;t++){
			int x = i + ch[t][0], y = j + ch[t][1];
			if(!check(x, y)) continue;
			d[x][y][0] = min(d[x][y][0], d[i][j][1] + c);
			if(d[x][y][1] > d[i][j][1] + c){
				d[x][y][1] = d[i][j][1] + c;
				upd(x, y);
			}
		}
		
		i = 0, j = p[0];
		for(int l=0;l<n;l++){
			if(mn[l] < mn[i]){
				i = l;
				j = p[i];
			}
		}

		//~ cout<<i<<" "<<j<<"\n";
		//~ for(int i=0;i<=n;i++) cout<<mn[i]<<" "<<p[i]<<"\n";
		//~ cout<<"\n";
		
		if(~j) used[i][j] = 1;
		
		mn[i] = 1e18, p[i] = -1;
		for(int l=0;l<m;l++){
			if(used[i][l]) continue;
			upd(i, l);
		}
		
		//~ print();
	}
	
	cout<<d[x[k-1]][y[k-1]][0]<<"\n";
}


컴파일 시 표준 에러 (stderr) 메시지

soccer.cpp: In function 'int main()':
soccer.cpp:63:7: warning: variable 'print' set but not used [-Wunused-but-set-variable]
   63 |  auto print = [&](){
      |       ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...