답안 #738401

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
738401 2023-05-08T16:22:08 Z 1075508020060209tc Soccer (JOI17_soccer) C++14
0 / 100
834 ms 54172 KB
#include<bits/stdc++.h>

using namespace std;
#define int long long
int H;int W;
int n;
int A;int B;int C;
int dir[5]={0,1,0,-1,0};
pair<int,int>ar[500005];
int mht[510][510];
int ok(int x,int y){
if(x>=1&&x<=H&&y>=1&&y<=W){return 1;}
return 0;
}
void mhtcalc(){
for(int i=1;i<=H;i++){
    for(int j=1;j<=W;j++){
        mht[i][j]=-1;
    }
}
queue<pair<int,int>>q;
for(int i=1;i<=n;i++){
    mht[ar[i].first][ar[i].second]=0;
    q.push(ar[i]);
}
while(q.size()){
    int nwx=q.front().first;
    int nwy=q.front().second;
    q.pop();
    for(int i=0;i<4;i++){
        int x=nwx+dir[i];int y=nwy+dir[i+1];
        if(!ok(x,y)){continue;}
        if(mht[x][y]==-1){
            mht[x][y]=mht[nwx][nwy]+1;
            q.push({x,y});
        }
    }
}
}
int dis[5][510][510];
int vis[5][510][510];


signed main(){
cin>>H>>W;
cin>>A>>B>>C;
cin>>n;
for(int i=1;i<=n;i++){
    cin>>ar[i].first>>ar[i].second;
}
mhtcalc();

for(int i=0;i<=4;i++){
    for(int a=1;a<=H;a++){
        for(int b=1;b<=W;b++){
            dis[i][a][b]=1e18;
        }
    }
}
priority_queue<pair<int,array<int,3>>,vector<pair<int,array<int,3>>>,greater<pair<int,array<int,3>>>>pq;
dis[0][ar[1].first][ar[1].second]=0;
pq.push({0,{0,ar[1].first,ar[1].second}});

while(pq.size()){
    int nwd=pq.top().second[0];
    int nwx=pq.top().second[1];
    int nwy=pq.top().second[2];
    pq.pop();
    if(vis[nwd][nwx][nwy]){continue;}
    vis[nwd][nwx][nwy]=1;
    if(nwd==0){
        for(int i=0;i<4;i++){
            int x=nwx+dir[i];int y=nwy+dir[i+1];
            if(!ok(x,y)){continue;}
            if(vis[0][x][y]){continue;}
            dis[0][x][y]=min(dis[0][x][y],dis[0][nwx][nwy]+C);
            pq.push({dis[0][x][y],{0,x,y}});
        }
        for(int i=1;i<=4;i++){
            int x=nwx+dir[i-1];int y=nwy+dir[i];
            if(!ok(x,y)){continue;}
            if(vis[i][x][y]){continue;}
            dis[i][x][y]=min(dis[i][x][y],dis[0][nwx][nwy]+A+B);
            pq.push({dis[i][x][y],{i,x,y}});
        }
        continue;
    }
    dis[0][nwx][nwy]=min(dis[0][nwx][nwy],dis[nwd][nwx][nwy]+mht[nwx][nwy]*C);
    pq.push({dis[0][nwx][nwy],{0,nwx,nwy}});
    int x=nwx+dir[nwd-1];int y=nwy+dir[nwd];
    if(ok(x,y)&&!vis[nwd][x][y]){
        dis[nwd][x][y]=min(dis[nwd][x][y],dis[nwd][nwx][nwy]+A);
        pq.push({dis[nwd][x][y],{nwd,x,y}});
    }
}
int ans=dis[0][ar[n].first][ar[n].second];
for(int i=1;i<=4;i++){
    ans=min(ans,dis[i][ar[n].first][ar[n].second]);
}
cout<<ans<<endl;

}
# 결과 실행 시간 메모리 Grader output
1 Correct 143 ms 16176 KB Output is correct
2 Incorrect 1 ms 340 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 834 ms 54172 KB Output is correct
2 Correct 788 ms 53904 KB Output is correct
3 Correct 579 ms 33012 KB Output is correct
4 Incorrect 9 ms 12244 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 143 ms 16176 KB Output is correct
2 Incorrect 1 ms 340 KB Output isn't correct
3 Halted 0 ms 0 KB -