Submission #1235911

#TimeUsernameProblemLanguageResultExecution timeMemory
1235911kss418Jakarta Skyscrapers (APIO15_skyscraper)C++20
57 / 100
1100 ms105828 KiB
#include <bits/stdc++.h>
#include <ext/rope>
#define fastio cin.tie(0), cout.tie(0), ios::sync_with_stdio(0);
#define all(x) (x).begin(), (x).end()
#define x first 
#define y second
using namespace std; using ll = long long;
using ld = long double; using pld = pair<ld, ld>;
using i128 = __int128_t; using f128 = __float128; 
using pll = pair<ll, ll>; using tll = tuple<ll, ll, ll>;
ll n, m, k, t = 1; string s;

constexpr ll INF = 0x3f3f3f3f3f3f3f3f;
constexpr ll MINF = 0xc0c0c0c0c0c0c0c0;
constexpr ll MAX = 30101; // SET MAX SIZE
constexpr ll MOD = 998244353;
pll a[MAX];
set <pll> num;

class _dij {
public:
    class node{
    public:
        ll d;
        node() : node(0){}
        node(ll d) : d(d){}
        ll num() const{ return d; }
        bool operator<(const node& ot) const{ return num() < ot.num(); }
        bool operator>(const node& ot) const{ return num() > ot.num(); }
        bool operator==(const node& ot) const{ return num() == ot.num(); }
        bool operator<=(const node& ot) const{ return num() <= ot.num(); }
        node operator+(const node& ot) const{
            return {d + ot.d};
        }
        operator ll(){ return d; }
    };
    node mx(){ return {INF}; }
    node mn(){ return {0}; }

    using ptl = pair <node, ll>;
    ll n; vector <node> d;
    vector <ll> pre;
    vector <vector<ptl>> adj;
    priority_queue <ptl, vector<ptl>, greater<ptl>> pq;

    _dij(){}
    _dij(ll n) { this->n = n; adj.resize(n + 1); }

    void add(ll st, ll en, node c) { // 양방향
        adj[st].push_back({ c,en });
        adj[en].push_back({ c,st });
    }
    void addsol(ll st, ll en, node c) { // 단방향
        adj[st].push_back({ c,en });
    }

    void init(ll st) {
        d.clear(); pre.clear();
        d.resize(n + 1, mx()); pre.resize(n + 1, -1); 
        pq.push({ mn(), st });
        d[st] = mn();

        while (!pq.empty()) {
            auto [cn, cur] = pq.top(); pq.pop();
            if(cn > d[cur]) continue;
            
            for (auto& i : adj[cur]) {
                auto [nn, nxt] = i;
                node pl = nn + cn;
        
                if (d[nxt] <= pl) continue;
                d[nxt] = pl; pre[nxt] = cur; 
                pq.push({ pl, nxt });
            }
        }
    }

    node ret(ll n) { return d[n]; }
};

unordered_map <ll, ll> mp[MAX];
deque <pll> q;
vector <ll> arr[MAX];

void run(){
    cin >> n >> m; _dij dij(n);
    for(int i = 1;i <= m;i++){
        cin >> a[i].x >> a[i].y;
        if(i != 1) arr[a[i].x].push_back(a[i].y);
    }

    q.push_back({a[1].x, a[1].y});
    mp[a[1].x][a[1].y] = 0;

    while(!q.empty()){
        auto[cur, cd] = q.front(); q.pop_front();
        if(cur - cd >= 0){
            if(!mp[cur - cd].count(cd)){
                q.push_back({cur - cd, cd});
                mp[cur - cd][cd] = mp[cur][cd] + 1;
            }
        }

        if(cur + cd < n){
            if(!mp[cur + cd].count(cd)){
                q.push_back({cur + cd, cd});
                mp[cur + cd][cd] = mp[cur][cd] + 1;
            }
        }

        for(auto& i : arr[cur]){
            if(mp[cur].count(i)) continue;
            q.push_front({cur, i});
            mp[cur][i] = mp[cur][cd];
        }
        arr[cur].clear();
    }
    
    ll result = INF;
    for(auto [idx, v] : mp[a[2].x]){
        result = min(result, v);
    }

    cout << (result == INF ? -1 : result);
}

int main() {
    fastio; // cin >> t;
    while(t--) run(); 

    return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...