Submission #1218709

#TimeUsernameProblemLanguageResultExecution timeMemory
1218709zaki98Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
408 ms25984 KiB
#include "bits/stdc++.h"
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
typedef long long ll;
#define F first
#define S second
#define PB push_back
#define MP make_pair
#define all(c) (c).begin(), (c).end()
//#define int long long
#define pii pair<int,int>
#define pll pair<long long, long long>
#define sz(a) (int)a.size()
// permutation of the last layer
#define LOO(i,a,b) for (int i = a; i <= b; i++)
#define OOL(i,a,b) for (int i = b; i >= a; i--)
#define max3(a, b, c) max(max(a, b), c)
#define min3(a, b, c) min(min(a, b), c)
#define ld long double

// #pragma GCC optimize("Ofast")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC optimize("avx2")

using namespace std;
typedef tree<int,null_type, less_equal<>,rb_tree_tag,tree_order_statistics_node_update> ordered_multiset;
typedef tree<int,null_type, less<>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;
constexpr ll MAX = 1e9+7;
void iO() {
    freopen("haircut.out", "w",stdout);
    freopen("haircut.in", "r",stdin);
}
vector<int> make_sorted_index(vector<auto> const &values) {
    vector<int> index(values.size());
    iota(index.begin(), index.end(), 0);
    stable_sort(index.begin(), index.end(), [&values](auto a, auto b) {
        return values[a] < values[b];
    });
    return index;
} // this function is so skibidi
struct chash {
    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);
    }

    int operator()(pii x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();return splitmix64(FIXED_RANDOM * x.first + x.second + FIXED_RANDOM);
    }
}; // gp_hash_table custom hash so skibid
vector<vector<pair<int, ll>>> graph;

void solve() {
    int n, m, b1, e1, b2, e2;
    cin>>n>>m>>b1>>e1>>b2>>e2;
    b1--;e1--;b2--;e2--;
    graph.resize(n);
    LOO(i,0,m-1) {
        int a,b,c;
        cin>>a>>b>>c;a--;b--;
        graph[a].PB(MP(b,c));
        graph[b].PB(MP(a, c));
    }
    vector<ll> djkistrab1(n, -1);
    vector<ll> djkistrae1(n, -1);
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> skibidius;
    skibidius.emplace(0, b1);
    while (!skibidius.empty()) {
        auto topp = skibidius.top();
        skibidius.pop();
        if (djkistrab1[topp.S]!=-1) continue;
        djkistrab1[topp.S] = topp.F;
        for (auto &child: graph[topp.S]) {
            if (djkistrab1[child.F]!=-1) continue;
            skibidius.push({topp.F+child.S, child.F});
        }
    }
    skibidius.emplace(0, e1);
    while (!skibidius.empty()) {
        auto topp = skibidius.top();
        skibidius.pop();
        if (djkistrae1[topp.S]!=-1) continue;
        djkistrae1[topp.S] = topp.F;
        for (auto &child: graph[topp.S]) {
            if (djkistrae1[child.F]!=-1) continue;
            skibidius.push({topp.F+child.S, child.F});
        }
    }
    ll shorty = djkistrab1[e1];
    priority_queue<pair<ll, pair<int, int>>, vector<pair<ll, pair<int, int>>>, greater<>> sigma;
    vector final_dj(4, vector<ll>(n, -1));
    sigma.push({0, {b2, 0}});
    while (!sigma.empty()) {
        auto top = sigma.top();
        sigma.pop();
        if (final_dj[top.S.S][top.S.F]!=-1) continue;
        final_dj[top.S.S][top.S.F] = top.F;
        if (top.S.S==0) {
            for (auto &child: graph[top.S.F]) {
                if (final_dj[0][child.F]==-1) sigma.push({top.F+child.S, {child.F, 0}});
            }
            if (final_dj[2][top.S.F]==-1) sigma.push({top.F, {top.S.F, 2}});
            if (final_dj[1][top.S.F]==-1) sigma.push({top.F, {top.S.F, 1}});
            if (final_dj[3][top.S.F]==-1) sigma.push({top.F, {top.S.F, 3}});
        }
        else if (top.S.S==1 || top.S.S == 3) {
            for (auto &child: graph[top.S.F]) {
                if (final_dj[top.S.S][child.F]==-1) {
                    if (top.S.S==1) {
                        if (djkistrab1[child.F]+djkistrae1[top.S.F]+child.S==shorty) {
                            sigma.push({top.F, {child.F, 1}});
                        }
                    }
                    else {
                        if (djkistrab1[top.S.F]+djkistrae1[child.F]+child.S==shorty) {
                            sigma.push({top.F, {child.F, 3}});
                        }
                    }
                }
            }
            if (final_dj[2][top.S.F]==-1) sigma.push({top.F, {top.S.F, 2}});
        }
        else {
            for (auto &child: graph[top.S.F]) {
                if (final_dj[2][child.F]==-1) sigma.push({top.F+child.S, {child.F, 2}});
            }
        }
    }
    cout << final_dj[2][e2] << '\n';
}
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
   // iO();
    int t = 1;
    //cin >> t;
    while (t--) {
        solve();
      //  cout << flush;
    }
    return 0;
}

Compilation message (stderr)

commuter_pass.cpp: In function 'void iO()':
commuter_pass.cpp:31:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   31 |     freopen("haircut.out", "w",stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:32:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   32 |     freopen("haircut.in", "r",stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...