Submission #854831

#TimeUsernameProblemLanguageResultExecution timeMemory
854831willychanSoccer (JOI17_soccer)C++14
100 / 100
489 ms40124 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//#include<bits/extc++.h>
//__gnu_pbds
#define int ll
const int N = 2000000;
ll dis[505][505];
ll ans[N];
int H,W;
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
vector<pair<int,int> > loc;
int a,b,c;
bool inbound2(int x,int y){
	return (x>=0 && x<=H && y>=0 && y<=W);
}

int mp(int x,int y,int l){
	return ((W+1)*(x)+y)+(((H+1)*(W+1))*l);
}
pair<pair<int,int> ,int > rb(int ind){
	int y = ind%(W+1);
	int x = (ind%((W+1)*(H+1))-y)/(W+1);
	int l = ind-(W+1)*x-y;
	l/= (H+1)*(W+1);
	return make_pair(make_pair(x,y),l);
}
void get_dis(){
	for(int i=0;i<=H;i++){
		for(int j=0;j<=W;j++) dis[i][j]=1e15;
	}
	queue<pair<int,int> > q;
	for(auto i :loc){
		dis[i.first][i.second]=0;
		q.push(i);
	}
	while(q.size()){
		pair<int,int> cur = q.front();
		q.pop();
		for(int i=0;i<4;i++){
			int x = cur.first+dx[i];
			int y = cur.second+dy[i];
			if(!inbound2(x,y)) continue;
			if(dis[x][y]<1e15) continue;
			dis[x][y] = dis[cur.first][cur.second]+c;
			q.push({x,y});
		}
	}
}

signed main(){
	ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>H>>W;		
	cin>>a>>b>>c;
	int n;cin>>n;
	for(int i=0;i<n;i++){
		pair<int,int> f;
		cin>>f.first>>f.second;
		loc.push_back(f);
	}
	get_dis();
	/*for(int i=0;i<=H;i++){
		for(int j=0;j<=W;j++){
			cout<<setw(5)<<dis[i][j]<<" ";
		}
		cout<<"\n";
	}*/
	for(int i=0;i<N;i++) ans[i] = 1e18;
	ans[mp(loc[0].first,loc[0].second,0)]=0;
	priority_queue<pair<ll,int> ,vector<pair<ll,int> >,greater<pair<ll,int> > > pq;
	pq.push({0,mp(loc[0].first,loc[0].second,0)});
	while(pq.size()){
		pair<ll,int> cur=  pq.top()	;
		pq.pop();
		if(cur.first!=ans[cur.second]) continue;
		pair<pair<int,int>,int> cor = rb(cur.second);
		if(cor.second==0){
			for(int k=0;k<4;k++){
				if(ans[mp(cor.first.first,cor.first.second,k+1)]>ans[cur.second]+dis[cor.first.first][cor.first.second]+b){
					ans[mp(cor.first.first,cor.first.second,k+1)] =ans[cur.second]+dis[cor.first.first][cor.first.second]+b; 
					pq.push({ans[mp(cor.first.first,cor.first.second,k+1)],mp(cor.first.first,cor.first.second,k+1)});
				}
				int x= cor.first.first+dx[k];
				int y = cor.first.second+dy[k];
				if(!inbound2(x,y)) continue;
				if(ans[mp(x,y,0)]>ans[cur.second]+c){
					ans[mp(x,y,0)] = ans[cur.second]+c;
					pq.push({ans[mp(x,y,0)],mp(x,y,0)});
				}
				
			}
		}else{
			int gg = cor.second;	
			gg--;
			int x=  cor.first.first+dx[gg];
			int y=  cor.first.second+dy[gg];
			if(inbound2(x,y)){
				if(ans[mp(x,y,cor.second)]>ans[cur.second]+a){
					ans[mp(x,y,cor.second)]=ans[cur.second]+a;
					pq.push({ans[mp(x,y,cor.second)],mp(x,y,cor.second)});
				}
			}
			if(ans[mp(cor.first.first,cor.first.second,0)]>ans[cur.second]){
				ans[mp(cor.first.first,cor.first.second,0)] = ans[cur.second];
				pq.push({ans[mp(cor.first.first,cor.first.second,0)],mp(cor.first.first,cor.first.second,0)});
			}
		}
	}
	cout<<ans[mp(loc[n-1].first,loc[n-1].second,0)]<<"\n";
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...