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...