Submission #1015404

#TimeUsernameProblemLanguageResultExecution timeMemory
1015404BaytoroSoccer (JOI17_soccer)C++17
100 / 100
713 ms65340 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define fr first #define sc second #define int ll #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.ren int dist[505][505][2][4]; int d[505][505]; vector<int> dx={1,-1,0,0}, dy={0,0,1,-1}; int h,w; bool check(int x, int y) { if(x<1) return 0; if(x>h) return 0; if(y<1) return 0; if(y>w) return 0; return 1; } void solve() { cin>>h>>w;h++,w++; int a,b,c;cin>>a>>b>>c; int n;cin>>n; vector<int> s(n),t(n); memset(dist,0x3f3f3f,sizeof dist); memset(d,0x3f3f3f,sizeof d); queue<pair<int,pair<int,int>>> pq; priority_queue<array<int,5>, vector<array<int,5>>, greater<array<int,5>>> dq; for(int i=0;i<n;i++) { cin>>s[i]>>t[i]; s[i]++,t[i]++; pq.push({0,{s[i],t[i]}}); d[s[i]][t[i]]=0; } while(!pq.empty()) { int D=pq.front().fr,x=pq.front().sc.fr,y=pq.front().sc.sc;pq.pop(); if(d[x][y]!=D) continue; for(int i=0;i<4;i++) { int X=x+dx[i],Y=y+dy[i]; if(check(X,Y) && d[X][Y]>d[x][y]+1) { d[X][Y]=d[x][y]+1; pq.push({d[x][y]+1,{X,Y}}); } } } for(int i=0;i<4;i++) { dq.push({0,i,1,s[0],t[0]}); dist[s[0]][t[0]][1][i]=0; } /*for(int i=1;i<=h;i++) { for(int j=1;j<=w;j++) cout<<d[i][j]<<' '; cout<<endl; }*/ while(!dq.empty()) { int D=dq.top()[0],dir=dq.top()[1],ball=dq.top()[2],x=dq.top()[3],y=dq.top()[4]; dq.pop(); if(dist[x][y][ball][dir]!=D) continue; //cout<<x<<' '<<y<<' '<<ball<<dir<<' '<<D<<endl; if(ball) { for(int i=0;i<4;i++) { int dd=D+c; if(check(x+dx[i],y+dy[i]) && dist[x+dx[i]][y+dy[i]][1][i]>dd) { dist[x+dx[i]][y+dy[i]][1][i]=dd; dq.push({dd,i,1,x+dx[i],y+dy[i]}); } dd=D+a+b; if(check(x+dx[i],y+dy[i]) && dist[x+dx[i]][y+dy[i]][0][i]>dd) { dist[x+dx[i]][y+dy[i]][0][i]=dd; dq.push({dd,i,0,x+dx[i],y+dy[i]}); } } } else { int X=x+dx[dir],Y=y+dy[dir]; int dd=D+a; if(check(X,Y) && dist[X][Y][0][dir]>dd) { dist[X][Y][0][dir]=dd; dq.push({dd,dir,0,X,Y}); } dd=D+d[x][y]*c; if(check(x,y) && dist[x][y][1][dir]>dd) { dist[x][y][1][dir]=dd; dq.push({dd,dir,1,x,y}); } } } int ans=1e18; for(int i=0;i<4;i++) { ans=min(ans,dist[s[n-1]][t[n-1]][0][i]); ans=min(ans,dist[s[n-1]][t[n-1]][1][i]); } cout<<ans<<endl; } signed main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int t=1;//cin>>t; while(t--){ solve(); } } //#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...