Submission #1360348

#TimeUsernameProblemLanguageResultExecution timeMemory
1360348marizaSky Walking (IOI19_walk)C++20
10 / 100
4106 ms537616 KiB
#include "walk.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

long long min_distance(vector<int> x, vector<int> h, vector<int> l, vector<int> r, vector<int> y, int s, int e){
    ll n=x.size(), m=l.size();
	map<pair<ll,ll>,vector<pair<ll,ll>>> g;

    // for(ll i=0; i<m; i++){
    //     ll prev=x[l[i]];
    //     for(ll j=l[i]+1; j<=r[i]; j++){
    //         if(y[i]<=h[j]){
    //             pair<ll,ll> u={y[i],prev}, v={y[i],x[j]};
    //             g[u].push_back(v);
    //             g[v].push_back(u);
    //             // cout<<u.first<<","<<u.second<<" - "<<v.first<<","<<v.second<<endl;
    //             prev=x[j];
    //         }
    //     }
    // }

    vector<ll> b[n], w[m];
    for(ll i=0; i<n; i++){
        b[i].push_back(0);
        for(ll j=0; j<m; j++){
            if(l[j]<=i && i<=r[j] && y[j]<=h[i]){
                b[i].push_back(y[j]);
                w[j].push_back(x[i]);
            }
        }
    }

    for(ll i=0; i<n; i++){
        sort(b[i].begin(),b[i].end());
        for(ll j=1; j<b[i].size(); j++){
            pair<ll,ll> u={b[i][j-1],x[i]}, v={b[i][j],x[i]};
            g[u].push_back(v);
            g[v].push_back(u);
        }
    }
    for(ll i=0; i<m; i++){
        sort(w[i].begin(),w[i].end());
        for(ll j=1; j<w[i].size(); j++){
            pair<ll,ll> u={y[i],w[i][j-1]}, v={y[i],w[i][j]};
            g[u].push_back(v);
            g[v].push_back(u);
        }
    }

    map<pair<ll,ll>,ll> dist; dist[{0,x[s]}]=0;
    map<pair<ll,ll>,bool> vis;
    priority_queue<pair<ll,pair<ll,ll>>> q; q.push({0,{0,x[s]}});
    while(!q.empty()){
        pair<ll,ll> curr=q.top().second;
        q.pop();
        
        if(vis[curr]) continue;
        vis[curr]=1;

        // cout<<curr.first<<" "<<curr.second<<" "<<dist[curr]<<endl;

        for(auto nxt:g[curr]){
            ll y=abs(curr.first-nxt.first)+abs(curr.second-nxt.second);
            if(dist.find(nxt)==dist.end() || dist[nxt]>dist[curr]+y){
                dist[nxt]=dist[curr]+y;
                q.push({-dist[nxt],nxt});
            }
        }
    }

    if(vis[{0,x[e]}]) return dist[{0,x[e]}];
    else return -1;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...