Submission #1277652

#TimeUsernameProblemLanguageResultExecution timeMemory
1277652trandangquangSoccer (JOI17_soccer)C++20
100 / 100
251 ms19032 KiB
#include<bits/stdc++.h>
using namespace std;

#define foru(i,a,b) for(int i=(a); i<=(b); ++i)
#define ford(i,a,b) for(int i=(a); i>=(b); --i)
#define rep(i,a) for(int i=0; i<(a); ++i)
#define sz(a) (int)(a).size()
#define all(a) (a).begin(),(a).end()
#define bit(s,i) (((s)>>(i))&1)
#define ii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define ll long long
#define _ << " " <<

template <class X, class Y> bool maxi(X &x, Y y){return x<y?x=y,true:false;}
template <class X, class Y> bool mini(X &x, Y y){return x>y?x=y,true:false;}

const int H=505;
const int N=1e5+5;

int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};

int h,w,a,b,c,n;
int s[N],t[N];
int minP[H][H]; ll d[H][H][5];

bool inBoard(int x, int y){
    return x>=0 && y>=0 && x<=h && y<=w;
}

void bfs(){
    memset(minP,0x3f,sizeof(minP));

    queue<ii> q;
    foru(i,1,n){
        minP[s[i]][t[i]]=0;
        q.push(ii(s[i],t[i]));
    }

    while(q.size()){
        auto [ux,uy]=q.front(); q.pop();

        rep(i,4){
            int vx=ux+dx[i], vy=uy+dy[i];
            if(!inBoard(vx,vy)) continue;

            if(minP[vx][vy]>minP[ux][uy]+1){
                minP[vx][vy]=minP[ux][uy]+1;
                q.push(ii(vx,vy));
            }
        }
    }

//    cout << minP[1][4] <<'\n';
}

void dijkstra(){
    memset(d,0x3f,sizeof(d));
    d[s[1]][t[1]][4]=0;

    struct Node{
        int ux,uy,ud; ll d;
        bool operator < (const Node &o) const {
            return d > o.d;
        }
    };

    priority_queue<Node> pq;
    pq.push({s[1],t[1],4,0});

    while(pq.size()){
        Node tp=pq.top(); pq.pop();
        if(tp.d > d[tp.ux][tp.uy][tp.ud]) continue;

        if(tp.ud==4){
            rep(i,4){
                int vx=tp.ux+dx[i], vy=tp.uy+dy[i], vd=tp.ud;
                if(!inBoard(vx,vy)) continue;

                if(d[vx][vy][vd] > tp.d + c){
                    d[vx][vy][vd] = tp.d + c;
                    pq.push({vx, vy, vd, d[vx][vy][vd]});
                }
            }
            rep(i,4){
                if(d[tp.ux][tp.uy][i] > tp.d + b){
                    d[tp.ux][tp.uy][i] = tp.d + b;
                    pq.push({tp.ux, tp.uy, i, tp.d+b});
                }
            }
        } else{
            int vx=tp.ux+dx[tp.ud], vy=tp.uy+dy[tp.ud], vd=tp.ud;
            if(inBoard(vx,vy)){
                if(d[vx][vy][vd] > tp.d + a){
                    d[vx][vy][vd] = tp.d + a;
                    pq.push({vx, vy, vd, d[vx][vy][vd]});
                }
            }

            if(d[tp.ux][tp.uy][4] > tp.d + 1LL * minP[tp.ux][tp.uy] * c){
                d[tp.ux][tp.uy][4] = tp.d + 1LL * minP[tp.ux][tp.uy] * c;
                pq.push({tp.ux, tp.uy, 4, d[tp.ux][tp.uy][4]});
            }
        }
    }

    ll res=1e18;
    rep(i,5) mini(res, d[s[n]][t[n]][i]);
    cout<<res<<'\n';
}

void solve(){
    cin>>h>>w;
    cin>>a>>b>>c;
    cin>>n;
    foru(i,1,n) cin>>s[i]>>t[i];

    bfs();
    dijkstra();
}

int32_t main(){
    #define task "test"
    if(fopen(task".inp","r")){
        freopen(task".inp","r",stdin);
        freopen(task".out","w",stdout);
    }
    cin.tie(0)->sync_with_stdio(0);

    int tc=1; // cin>>tc;
    rep(i,tc){
        solve();
    }
}

Compilation message (stderr)

soccer.cpp: In function 'int32_t main()':
soccer.cpp:129:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  129 |         freopen(task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
soccer.cpp:130:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  130 |         freopen(task".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...