Submission #388054

#TimeUsernameProblemLanguageResultExecution timeMemory
388054HegdahlRobot (JOI21_ho_t4)C++17
34 / 100
3078 ms277868 KiB
#pragma GCC optimize("Ofast") #define _USE_MATH_DEFINES #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #ifdef ENABLE_DEBUG #include <debug.h> #else #define DEBUG(...) do {} while (0) #endif using namespace std; using namespace __gnu_pbds; using ll = long long; using ull = unsigned long long; using lll = __int128; using ulll = unsigned __int128; using ld = long double; template<typename T, size_t N> using ar = array<T, N>; template<typename T, typename Cmp = less<T>> using iset = tree<T, null_type, Cmp, rb_tree_tag, tree_order_statistics_node_update, allocator<T>>; #define REPSI(name, start, stop, step) for (ll name = start; name < (ll)stop; name += step) #define REPS(name, start, stop) REPSI(name, start, stop, 1) #define REP(name, stop) REPS(name, 0, stop) #define RREPSI(name, start, stop, step) for (ll name = stop-1; name >= (ll)start; name -= step) #define RREPS(name, start, stop) RREPSI(name, start, stop, 1) #define RREP(name, stop) RREPS(name, 0, stop) template<typename T> void cins(T &first) { cin >> first; } template<typename T, typename... Ts> void cins(T &first, T &second, Ts&... rest) { cin >> first; cins(second, rest...); } #define GET(type, ...) type __VA_ARGS__; cins(__VA_ARGS__) #define GETI(...) GET(int, __VA_ARGS__) #define GETLL(...) GET(ll, __VA_ARGS__) #define GETS(...) GET(string, __VA_ARGS__) #define GETD(...) GET(double, __VA_ARGS__) #define GETC(...) GET(char, __VA_ARGS__) struct hsh { size_t operator()(uint64_t x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); x += FIXED_RANDOM; x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31); } }; const int mxN = 1e5; vector<ar<ll, 4>> g[mxN]; vector<ll> dist[mxN]; gp_hash_table<ll, ll, hsh> ccnt[mxN], csum[mxN]; int main() { ios::sync_with_stdio(0);cin.tie(0); GETI(n, m); REP(mm, m) { GETI(i, j, c, p); --i, --j; ll oi = g[i].size(); ll oj = g[j].size(); g[i].push_back({j, c, p, oj}); g[j].push_back({i, c, p, oi}); ++ccnt[i][c]; ++ccnt[j][c]; csum[i][c] += p; csum[j][c] += p; } REP(i, n) DEBUG(ccnt[i]); REP(i, n) dist[i].resize(g[i].size()+1, -1); // cost, i, j priority_queue<ar<ll, 3>, vector<ar<ll, 3>>, greater<ar<ll, 3>>> pq; pq.push({0, 0, g[0].size()}); while (pq.size()) { auto [cost, i, j] = pq.top(); pq.pop(); if (dist[i][j] != -1) continue; dist[i][j] = cost; DEBUG(ar<ll, 2>{i, j}); DEBUG(cost); ll changed = -1; if (j < g[i].size()) changed = g[i][j][1]; REP(k, g[i].size()) { if (k == j) continue; auto [nxt, color, w, nj] = g[i][k]; ll others = csum[i][color] - w; ll cnt = ccnt[i][color]; if (color == changed) { others -= g[i][j][2]; --cnt; } if (cnt == 1 && dist[nxt][g[nxt].size()] == -1) pq.push({cost, nxt, g[nxt].size()}); else { pq.push({cost+others, nxt, g[nxt].size()}); } if (dist[nxt][nj] == -1) pq.push({cost+w, nxt, nj}); } } REP(i, n) DEBUG(dist[i]); ll ans = 1LL<<60; for (ll x : dist[n-1]) if (x != -1) ans = min(ans, x); if (ans == (1LL<<60)) ans = -1; cout << ans << '\n'; }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:94:27: warning: narrowing conversion of 'g[0].std::vector<std::array<long long int, 4> >::size()' from 'std::vector<std::array<long long int, 4> >::size_type' {aka 'long unsigned int'} to 'long long int' [-Wnarrowing]
   94 |   pq.push({0, 0, g[0].size()});
      |                  ~~~~~~~~~^~
Main.cpp:107:11: warning: comparison of integer expressions of different signedness: 'std::tuple_element<2, std::array<long long int, 3> >::type' {aka 'long long int'} and 'std::vector<std::array<long long int, 4> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |     if (j < g[i].size()) changed = g[i][j][1];
      |         ~~^~~~~~~~~~~~~
Main.cpp:121:40: warning: narrowing conversion of 'g[nxt].std::vector<std::array<long long int, 4> >::size()' from 'std::vector<std::array<long long int, 4> >::size_type' {aka 'long unsigned int'} to 'long long int' [-Wnarrowing]
  121 |         pq.push({cost, nxt, g[nxt].size()});
      |                             ~~~~~~~~~~~^~
Main.cpp:123:47: warning: narrowing conversion of 'g[nxt].std::vector<std::array<long long int, 4> >::size()' from 'std::vector<std::array<long long int, 4> >::size_type' {aka 'long unsigned int'} to 'long long int' [-Wnarrowing]
  123 |         pq.push({cost+others, nxt, g[nxt].size()});
      |                                    ~~~~~~~~~~~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...