Advertisement
tiom4eg

openol C 47

Jan 16th, 2023
448
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.85 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. // tiom4eg's precompiler options
  3. // POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS
  4. // IO settings
  5. #define fastIO ios_base::sync_with_stdio(false); cin.tie(0)
  6. // Quick types
  7. #define ll long long
  8. #define ld long double
  9. #define ull unsigned long long
  10. #define pii pair <int, int>
  11. #define vi vector <int>
  12. #define mi vector <vector <int>>
  13. // Quick functions
  14. #define endl "\n"
  15. #define F first
  16. #define S second
  17. #define all(a) a.begin(), a.end()
  18. #define sz(a) (int)(a.size())
  19. #define pb push_back
  20. #define mp make_pair
  21. // Quick fors
  22. #define FOR(i, a, b) for (int i = a; i < b; ++i)
  23. #define FORS(i, a, b, c) for (int i = a; i < b; i += c)
  24. #define RFOR(i, a, b) for (int i = a; i >= b; --i)
  25. #define EACH(e, a) for (auto& e : a)
  26. // Pragmas
  27. #ifndef TIOM4EG
  28. #pragma GCC optimize("O3,unroll-loops") // let the chaos begin!
  29. #pragma GCC target("avx,avx2,bmi,bmi2,popcnt,lzcnt,tune=native")
  30. #pragma GCC comment(linker, "/stack:200000000")
  31. #endif
  32. // PBDS
  33. #include <ext/pb_ds/assoc_container.hpp>
  34. #include <ext/pb_ds/tree_policy.hpp>
  35. #define ordered_set tree <int, null_type, less <int>, rb_tree_tag, tree_order_statistics_node_update>
  36. #define ook order_of_key
  37. #define fbo find_by_order
  38. using namespace __gnu_pbds;
  39. // POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS
  40. using namespace std;
  41. mt19937 rng(chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now().time_since_epoch()).count());
  42. #define int long long
  43. const int INF = 1e9 + 7, INFLL = 1e18 + 7, MD = 998244353, R = 1 << 18, MOD = 1e9 + 7, MAX = 500009, LG = 20, B = 31, S = 10008;
  44.  
  45. #define min(a, b) ((a < b) ? (a) : (b))
  46. #define max(a, b) ((a > b) ? (a) : (b))
  47.  
  48. int b[MAX], e[MAX], w[MAX], nx[MAX];
  49. vi fr[MAX];
  50.  
  51. signed main() {
  52.     fastIO;
  53.     int n, m, t; cin >> n >> m >> t;
  54.     if (t < 3) {
  55.         int t = 0;
  56.         vi used(m), d(n, INFLL);
  57.         FOR(i, 0, m) cin >> b[i] >> e[i] >> w[i] >> nx[i], --e[i], --nx[i], fr[--b[i]].pb(i);
  58.         set <pii> q;
  59.         d[0] = 0, q.insert({0, 0});
  60.         auto relax = [&](int v) {
  61.             ++t;
  62.             int c = d[b[v]], l = w[v];
  63.             while (v != -2 && used[v] != t) {
  64.                 used[v] = t;
  65.                 c += l, l = (l ? l - 1 : l);
  66.                 if (d[e[v]] > c) {
  67.                     q.erase({d[e[v]], e[v]});
  68.                     d[e[v]] = c;
  69.                     q.insert({d[e[v]], e[v]});
  70.                 }
  71.                 v = nx[v];
  72.             }
  73.         };
  74.         while (!q.empty()) {
  75.             int x = q.begin()->S;
  76.             q.erase(q.begin());
  77.             EACH(v, fr[x]) relax(v);
  78.         }
  79.         EACH(x, d) cout << (x == INFLL ? -1 : x) << ' ';
  80.         return 0;
  81.     }
  82.     if (t == 3) {
  83.         vector <pii> g[n];
  84.         FOR(i, 0, m) {
  85.             int u, v, w, d; cin >> u >> v >> w >> d, --u, --v;
  86.             g[u].pb({v, w});
  87.         }
  88.         vi d(n, INFLL);
  89.         priority_queue <pii> q;
  90.         d[0] = 0, q.push({0, 0});
  91.         while (!q.empty()) {
  92.             auto [w, v] = q.top();
  93.             q.pop();
  94.             if (-w > d[v]) continue;
  95.             for (auto& [u, z] : g[v]) if (d[u] > d[v] + z) d[u] = d[v] + z, q.push({-d[u], u});
  96.         }
  97.         FOR(i, 0, n) cout << (d[i] == INFLL ? -1 : d[i]) << ' ';
  98.         return 0;
  99.     }
  100.     if (t == 4) {
  101.         vector <pii> edges(m);
  102.         vi d(n, INF), used(m), g[n];
  103.         FOR(i, 0, m) {
  104.             int u, v, w, d; cin >> u >> v >> w >> d, --u, --v, --d;
  105.             edges[i] = {v, d}, g[u].pb(i);
  106.         }
  107.         deque <int> q;
  108.         d[0] = 0, q.pb(0);
  109.         while (!q.empty()) {
  110.             int v = q.front(); q.pop_front();
  111.             EACH(id, g[v]) while (id != -2 && !used[id]) {
  112.                 if (d[edges[id].F] == INF) d[edges[id].F] = d[v] + 1, q.pb(edges[id].F);
  113.                 used[id] = 1, id = edges[id].S;
  114.             }
  115.         }
  116.         FOR(i, 0, n) cout << (d[i] == INF ? -1 : d[i]) << ' ';
  117.         return 0;
  118.     }
  119.     if (t == 5) {
  120.         vi used(11 * m + 1), d(11 * m + 1, INFLL);
  121.         FOR(i, 0, m) cin >> b[i] >> e[i] >> w[i] >> nx[i], --e[i], --nx[i], fr[--b[i]].pb(i);
  122.         set <pii> q;
  123.         d[11 * m] = 0, nx[m] = -2;
  124.         q.insert({0, 11 * m});
  125.         /*auto relax = [&](int v) {
  126.             //cout << "-------\n" << v << ' ' << d[v] << endl;
  127.             used[v] = ++t;
  128.             int c = d[v], l = max(0, v % 11 - 1);
  129.             v /= 11, v = nx[v];
  130.             while (v != -2 && used[11 * v + l] != t) {
  131.                 used[11 * v + l] = t, c += l;
  132.                 //cout << v << ' ' << c << ' ' << l << endl;
  133.                 if (d[11 * v + l] <= c) break;
  134.                 q.erase({d[11 * v + l], 11 * v + l});
  135.                 d[11 * v + l] = c;
  136.                 q.insert({d[11 * v + l], 11 * v + l});
  137.                 l = (l ? l - 1 : l), v = nx[v];
  138.             }
  139.         };*/
  140.         while (!q.empty()) {
  141.             int x = q.begin()->S, v = x / 11, z = x % 11;
  142.             q.erase(q.begin());
  143.             if (nx[v] != -2) {
  144.                 //relax(x);
  145.                 if (d[11 * nx[v] + max(0, z - 1)] > d[x] + max(0, z - 1)) {
  146.                     q.erase({d[11 * nx[v] + max(0, z - 1)], 11 * nx[v] + max(0, z - 1)});
  147.                     d[11 * nx[v] + max(0, z - 1)] = d[x] + max(0, z - 1);
  148.                     q.insert({d[11 * nx[v] + max(0, z - 1)], 11 * nx[v] + max(0, z - 1)});
  149.                 }
  150.             }
  151.             EACH(u, fr[e[v]]) {
  152.                 if (u == nx[v]) continue;
  153.                 if (d[11 * u + w[u]] <= d[x] + w[u]) break;
  154.                 q.erase({d[11 * u + w[u]], 11 * u + w[u]});
  155.                 d[11 * u + w[u]] = d[x] + w[u];
  156.                 q.insert({d[11 * u + w[u]], 11 * u + w[u]});
  157.             }
  158.         }
  159.         vi ans(n, INFLL);
  160.         FOR(i, 0, 11 * m + 1) ans[e[i / 11]] = min(ans[e[i / 11]], d[i]);
  161.         FOR(i, 0, n) cout << (ans[i] == INFLL ? -1 : ans[i]) << ' ';
  162.     }
  163. }
  164.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement