Submission #1301922

#TimeUsernameProblemLanguageResultExecution timeMemory
1301922Ghulam_JunaidJakarta Skyscrapers (APIO15_skyscraper)C++20
57 / 100
1100 ms103280 KiB
#include <bits/stdc++.h>
using namespace std;

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};


const int N = 3e4 + 10;
int n, m, b[N], ite, p[N], ans = 1e9;
vector<int> at[N];
unordered_map<long long, int, custom_hash> dist;
bool vis[N];

void f(int v, int e){
    queue<pair<int, int>> q;
    for (int x : at[v]){
        q.push({v, x});
        dist[v * N + x] = 0;
    }
    vis[v] = 1;

    while (!q.empty()){
        auto [v, x] = q.front();
        q.pop();

        if (v == e){
            ans = dist[v * N + x];
            break;
        }

        for (int u : {v + x, v - x}){
            if (u < 0 or u >= n) continue;
            if (dist.find(u * N + x) == dist.end())
                dist[u * N + x] = 1e9;
            if (dist[u * N + x] > dist[v * N + x] + 1){
                dist[u * N + x] = dist[v * N + x] + 1;
                q.push({u, x});
                ite++;
                if (!vis[u]){
                    vis[u] = 1;
                    for (int y : at[u]){
                        if (dist.find(u * N + y) != dist.end())
                            continue;
                        q.push({u, y});
                        ite++;
                        dist[u * N + y] = dist[u * N + x];
                    }
                }
            }
        }
        if (ite > 1e7) cout << 1/0 << endl;
    }
}

int main(){
    cin >> n >> m;
    for (int i = 0; i < m; i ++){
        cin >> b[i] >> p[i], at[b[i]].push_back(p[i]);
    }
    f(b[0], b[1]);
    if (ans == 1e9) ans = -1;
    cout << ans << endl;
}

Compilation message (stderr)

skyscraper.cpp: In function 'void f(int, int)':
skyscraper.cpp:63:33: warning: division by zero [-Wdiv-by-zero]
   63 |         if (ite > 1e7) cout << 1/0 << endl;
      |                                ~^~
#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...