Submission #361254

#TimeUsernameProblemLanguageResultExecution timeMemory
361254jainbot27Soccer (JOI17_soccer)C++17
30 / 100
3033 ms69288 KiB
#include <bits/stdc++.h>
using namespace std;

#define f first
#define s second
#define pb push_back
#define ar array
#define all(x) x.begin(), x.end()
#define siz(x) (int)x.size()

#define FOR(x, y, z) for(int x = (y); x < (z); x++)
#define ROF(x, z, y) for(int x = (y-1); x >= (z); x--)
#define F0R(x, z) FOR(x, 0, z)
#define R0F(x, z) ROF(x, 0, z)
#define trav(x, y) for(auto&x:y)

using ll = long long;
using vi = vector<int>;
using vl = vector<long long>;
using pii = pair<int, int>;
using vpii = vector<pair<int, int>>;

template<class T> inline bool ckmin(T&a, T b) {return b < a ? a = b, 1 : 0;}
template<class T> inline bool ckmax(T&a, T b) {return b > a ? a = b, 1 : 0;}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const char nl = '\n';
const int mxK = 100001;
const int mxN = 501;
const int MOD = 1e9 + 7;
const long long infLL = 1e18;

using node = pair<ll, ar<int, 2>>;
int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};


ll A, B, C;
int n, m;
int k;
pii pts[mxK];
bool dude[mxN][mxN];
ll dist[mxN][mxN];
int near[mxN][mxN];

queue<pii> bfs;
priority_queue<node, vector<node>, greater<node>> pq;

int32_t main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

    memset(near, 0x3f, sizeof(near));
    cin >> n >> m >> A >> B >> C >> k;
    n++; m++;
    F0R(i, k){
        cin >> pts[i].f >> pts[i].s;
        near[pts[i].f][pts[i].s] = 0;
        bfs.push({pts[i].f, pts[i].s});
    }
    while(!bfs.empty()){
        pii x = bfs.front();
        bfs.pop();
        F0R(i, 4){
            pii nx = x;
            nx.f += dx[i];
            nx.s += dy[i];
            if(nx.f < 0 || nx.f >= n || nx.s < 0 || nx.s >= m) continue;
            if(ckmin(near[nx.f][nx.s], near[x.f][x.s]+1)){
                bfs.push(nx);
            }
        } 
    }
    F0R(i, n){
        F0R(j, m){
            dist[i][j] = infLL;
        }
    }
    dist[pts[0].f][pts[0].s] = 0;
    pq.push({0, {pts[0].f, pts[0].s}});

    while(!pq.empty()){
        node U = pq.top();
        ll du = U.f;
        ar<int, 2> u = U.s;
        pq.pop();
        if(du!=dist[u[0]][u[1]]){
            continue;
        }
        F0R(i, n){
            if(ckmin(dist[i][u[1]], dist[u[0]][u[1]]+C*abs(u[0]-i))){
                pq.push({dist[i][u[1]], {i, u[1]}});
            }
            if(ckmin(dist[i][u[1]], dist[u[0]][u[1]]+B+A*abs(u[0]-i)+C*near[i][u[1]])){
                pq.push({dist[i][u[1]], {i, u[1]}});
            }
        }
        F0R(j, m){
            if(ckmin(dist[u[0]][j], du+C*abs(u[1]-j))){
                pq.push({dist[u[0]][j], {u[0], j}});
            }
            if(ckmin(dist[u[0]][j], du+B+A*abs(u[1]-j)+C*(near[u[0]][j]))){
                pq.push({dist[u[0]][j], {u[0], j}});
            }
        }
    } 
    //F0R(i, n){
    //    F0R(j, m){
    //        cout << near[i][j] << ' ';
    //    }
    //    cout << nl;
    //}
    //F0R(i, n){
    //    F0R(j, m){
    //        cout << dist[i][j] << ' ';
    //    }
    //    cout << nl;
    //}
    cout << dist[pts[k-1].f][pts[k-1].s] << nl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...