Submission #1013296

#TimeUsernameProblemLanguageResultExecution timeMemory
1013296snpmrnhlolSoccer (JOI17_soccer)C++17
100 / 100
196 ms19340 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 501; const int K = 1e5; const ll inf = 1e18; struct point{ int x,y; }; ll dist[N][N][3]; int dist2[N][N]; bool vis[N][N]; point player[K]; priority_queue <array<ll,4>> pq; queue <array<int,2>> q; int d[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; int n,m,a,b,c; int k; bool inbound(int x,int y){ return 0 <= x && x <= n && 0 <= y && y <= m; } void add(ll nr,int x,int y,int id){ if(dist[x][y][id] > nr){ dist[x][y][id] = nr; pq.push({-nr,x,y,id}); } } void bfs(){ for(int i = 0;i < k;i++){ q.push({player[i].x,player[i].y}); vis[player[i].x][player[i].y] = 1; dist2[player[i].x][player[i].y] = 0; } while(!q.empty()){ int x = q.front()[0]; int y = q.front()[1]; q.pop(); for(int l = 0;l < 4;l++){ int nx = x + d[l][0]; int ny = y + d[l][1]; if(inbound(nx,ny) && !vis[nx][ny]){ vis[nx][ny] = 1; dist2[nx][ny] = dist2[x][y] + 1; q.push({nx,ny}); } } } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>m; cin>>a>>b>>c; cin>>k; for(int i = 0;i < k;i++){ cin>>player[i].x>>player[i].y; } for(int i = 0;i <= n;i++){ for(int j = 0;j <= m;j++){ for(int l = 0;l < 3;l++){ dist[i][j][l] = inf; } } } bfs(); pq.push({0,player[0].x,player[0].y,0}); dist[player[0].x][player[0].y][0] = 0; ///0 - on player ///1 - thrown left/right ///2 - thrown up/down while(!pq.empty()){ auto x = pq.top(); x[0] = -x[0]; pq.pop(); if(x[0] != dist[x[1]][x[2]][x[3]]){ continue; } if(x[3] == 0){ ///throw ball add(x[0] + b,x[1],x[2],1); add(x[0] + b,x[1],x[2],2); ///directional movement for(int l = 0;l < 4;l++){ int nx = x[1] + d[l][0]; int ny = x[2] + d[l][1]; if(inbound(nx,ny)){ add(x[0] + c,nx,ny,x[3]); } } }else if(x[3] == 1){ ///catch add(x[0] + 1ll*dist2[x[1]][x[2]]*c,x[1],x[2],0); ///directional movement for(int l = 2;l < 4;l++){ int nx = x[1] + d[l][0]; int ny = x[2] + d[l][1]; if(inbound(nx,ny)){ add(x[0] + a,nx,ny,x[3]); } } }else{ ///catch add(x[0] + 1ll*dist2[x[1]][x[2]]*c,x[1],x[2],0); ///directional movement for(int l = 0;l < 2;l++){ int nx = x[1] + d[l][0]; int ny = x[2] + d[l][1]; if(inbound(nx,ny)){ add(x[0] + a,nx,ny,x[3]); } } } } /*for(ll i = 0;i <= n;i++){ for(ll j = 0;j <= m;j++){ cout<<dist[i][j][0]<<' '; } cout<<'\n'; }*/ cout<<dist[player[k - 1].x][player[k - 1].y][0]<<'\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...