제출 #241773

#제출 시각아이디문제언어결과실행 시간메모리
241773IgorICommuter Pass (JOI18_commuter_pass)C++17
0 / 100
43 ms1920 KiB
const int LG = 21; const int N = 305; const long long MOD = 1e9 + 7; const long long INF = 1e9; const long long INFLL = 1e18; #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vi; typedef vector<vector<int> > vvi; typedef vector<ll> vll; #define forn(i, n) for (int (i) = 0; (i) != (n); (i)++) #define all(v) (v).begin(), (v).end() #define rall(v) (v).rbegin(), (v).rend() #define popcount(x) __builtin_popcount(x) #define popcountll(x) __builtin_popcountll(x) #define fi first #define se second #define re return #define pb push_back #define uniq(x) sort(all(x)); (x).resize(unique(all(x)) - (x).begin()) #ifdef LOCAL #define dbg(x) cerr << __LINE__ << " " << #x << " " << x << endl #define ln cerr << __LINE__ << endl #else #define dbg(x) void(0) #define ln void(0) #endif // LOCAL int cx[4] = {-1, 0, 1, 0}; int cy[4] = {0, -1, 0, 1}; string Yes[2] = {"No", "Yes"}; string YES[2] = {"NO", "YES"}; ll inq(ll x, ll y) { if (!y) re 1 % MOD; ll l = inq(x, y / 2); if (y % 2) re l * l % MOD * x % MOD; re l * l % MOD; } ll rev(ll x) { return inq(x, MOD - 2); } bool __precomputed_combinatorics = 0; vector<ll> __fact, __ufact, __rev; void __precompute_combinatorics() { __precomputed_combinatorics = 1; __fact.resize(N); __ufact.resize(N); __rev.resize(N); __rev[1] = 1; for (int i = 2; i < N; i++) __rev[i] = MOD - __rev[MOD % i] * (MOD / i) % MOD; __fact[0] = 1, __ufact[0] = 1; for (int i = 1; i < N; i++) __fact[i] = __fact[i - 1] * i % MOD, __ufact[i] = __ufact[i - 1] * __rev[i] % MOD; } ll fact(int x) { if (!__precomputed_combinatorics) __precompute_combinatorics(); return __fact[x]; } ll cnk(int n, int k) { if (k < 0 || k > n) return 0; if (!__precomputed_combinatorics) __precompute_combinatorics(); return __fact[n] * __ufact[n - k] % MOD * __ufact[k] % MOD; } int Root(int x, vector<int> &root) { if (x == root[x]) return x; return root[x] = Root(root[x], root); } void Merge(int v, int u, vector<int> &root, vector<int> &sz) { v = Root(v, root), u = Root(u, root); if (v == u) return; if (sz[v] < sz[u]) { sz[u] += sz[v]; root[v] = u; } else { sz[v] += sz[u]; root[u] = v; } } int ok(int x, int n) { return 0 <= x && x < n; } void bfs(int v, vi &dist, vector<vi> &graph) { fill(all(dist), -1); dist[v] = 0; vi q = {v}; for (int i = 0; i < q.size(); i++) { for (auto u : graph[q[i]]) { if (dist[u] == -1) { dist[u] = dist[q[i]] + 1; q.push_back(u); } } } } vector<int> z_func(string &s) { vector<int> z(s.size()); z[0] = s.size(); int L = 0, R = 0; for (int i = 1; i < s.size(); i++) { z[i] = max(0, min(z[i - L], R - i)); while (i + z[i] < s.size() && s[i + z[i]] == s[z[i]]) z[i]++; if (i + z[i] > R) { R = i + z[i]; L = i; } } return z; } vector<int> p_func(string &s) { vector<int> p(s.size()); for (int i = 1; i < s.size(); i++) { int j = p[i - 1]; while (j > 0 && s[i] != s[j]) j = p[j - 1]; if (s[i] == s[j]) j++; p[i] = j; } return p; } vector<int> d1_func(string &s) { vector<int> d1(s.size()); int L = 0, R = -1; for (int i = 0; i < s.size(); i++) { int k = 0; if (i <= R) k = min(R - i + 1, d1[R - i + L]); while (i + k < s.size() && i - k >= 0 && s[i - k] == s[i + k]) k++; d1[i] = k--; if (i + k > R) { L = i - k; R = i + k; } } return d1; } vector<int> d2_func(string &s) { vector<int> d2(s.size()); int L = 0, R = -1; for (int i = 1; i < s.size(); i++) { int k = 0; if (i <= R) k = min(R - i + 1, d2[R - i + L + 1]); while (i + k < s.size() && i - k - 1 >= 0 && s[i - k - 1] == s[i + k]) k++; d2[i] = k--; if (i + k > R) { L = i - k - 1; R = i + k; } } return d2; } ll log10(ll x) { if (x < 10) re 1; re 1 + log10(x / 10); } ll ds(ll x) { if (x < 10) return x; re x % 10 + ds(x / 10); } double sqr(double x) { return x * x; } void Del(vector<int> &v, int pos) { swap(v[pos], v[v.size() - 1]); v.pop_back(); } ll g[N][N]; signed main() { srand(time(NULL)); ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m, s, t, u, v; cin >> n >> m >> s >> t >> u >> v; s--, t--, u--, v--; forn(i, n) { forn(j, n) { g[i][j] = INFLL; } g[i][i] = 0; } forn(i, m) { ll a, b, c; cin >> a >> b >> c; a--, b--; g[b][a] = min(g[b][a], c); g[a][b] = min(g[a][b], c); } forn(k, n) { forn(i, n) { forn(j, n) { g[i][j] = min(g[i][j], g[i][k] + g[k][j]); } } } ll ans = g[v][u]; for (int c = 0; c < n; c++) { if (c == s || c == t) if (g[s][c] + g[c][t] == g[s][t]) { ll A = INFLL, B = INFLL; for (int i = 0; i < n; i++) { if (g[s][i] + g[i][c] == g[s][c]) { A = min(A, g[v][i]); } if (g[t][i] + g[i][c] == g[t][c]) { B = min(B, g[u][i]); } } ans = min(ans, A + B); } } for (int c = 0; c < n; c++) { if (c == s || c == t) if (g[s][c] + g[c][t] == g[s][t]) { ll A = INFLL, B = INFLL; for (int i = 0; i < n; i++) { if (g[s][i] + g[i][c] == g[s][c]) { A = min(A, g[u][i]); } if (g[t][i] + g[i][c] == g[t][c]) { B = min(B, g[v][i]); } } ans = min(ans, A + B); } } cout << ans; } /* Note: Check constants at the beginning of the code. N is set to 4e5 but be careful in problems with large constant factor. Setting N in every problem is more effective. Check corner cases. N = 1 No def int long long for now. Add something here. */

컴파일 시 표준 에러 (stderr) 메시지

commuter_pass.cpp: In function 'void bfs(int, vi&, std::vector<std::vector<int> >&)':
commuter_pass.cpp:115:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < q.size(); i++)
                     ~~^~~~~~~~~~
commuter_pass.cpp: In function 'std::vector<int> z_func(std::__cxx11::string&)':
commuter_pass.cpp:133:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 1; i < s.size(); i++)
                     ~~^~~~~~~~~~
commuter_pass.cpp:136:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (i + z[i] < s.size() && s[i + z[i]] == s[z[i]]) z[i]++;
                ~~~~~~~~~^~~~~~~~~~
commuter_pass.cpp: In function 'std::vector<int> p_func(std::__cxx11::string&)':
commuter_pass.cpp:149:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 1; i < s.size(); i++)
                     ~~^~~~~~~~~~
commuter_pass.cpp: In function 'std::vector<int> d1_func(std::__cxx11::string&)':
commuter_pass.cpp:165:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < s.size(); i++)
                     ~~^~~~~~~~~~
commuter_pass.cpp:169:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (i + k < s.size() && i - k >= 0 && s[i - k] == s[i + k])
                ~~~~~~^~~~~~~~~~
commuter_pass.cpp: In function 'std::vector<int> d2_func(std::__cxx11::string&)':
commuter_pass.cpp:185:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 1; i < s.size(); i++)
                     ~~^~~~~~~~~~
commuter_pass.cpp:189:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (i + k < s.size() && i - k - 1 >= 0 && s[i - k - 1] == s[i + k])
                ~~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...