제출 #1319262

#제출 시각아이디문제언어결과실행 시간메모리
1319262darkdevilvaqif꿈 (IOI13_dreaming)C++20
100 / 100
102 ms12864 KiB
/* _ __ __ __ ____ ___ _ __ | | /| / / ___ _ / /_ ____ / / / __ \ ___ ___ / _ \ (_) ___ ____ ___ / / | |/ |/ / / _ `// __// __/ / _ \ / /_/ / / _ \/ -_) / ___/ / / / -_)/ __// -_) /_/ |__/|__/ \_,_/ \__/ \__/ /_//_/ \____/ /_//_/\__/ /_/ /_/ \__/ \__/ \__/ (_) */ #pragma GCC optimize("O3") #pragma GCC optimize ("unroll-loops") // #pragma GCC target("avx2") #include "dreaming.h" #include <bits/stdc++.h> using namespace std; // constants // functions int GCD(int A, int B); int LCM(int A, int B); int power(int base, int exponent); // structs struct graph { vector <vector <pair <int, int> > > g; vector <int> dist, par; vector <bool> used; void cleanse() { fill(dist.begin(), dist.end(), 0); fill(par.begin(), par.end(), -1); fill(used.begin(), used.end(), false); } void prep(int n) { g.resize(n); dist.resize(n); par.resize(n); used.resize(n); cleanse(); } void adde(int u, int v, int w) { g[u].push_back({v, w}); g[v].push_back({u, w}); } vector <int> path; void DFS(int v) { used[v] = true; path.push_back(v); for (auto [u, w] : g[v]) { if (used[u]) { continue; } par[u] = v; dist[u] = dist[v] + w; DFS(u); } } }; // globals // variables // iterators int i; // notes /* My favorite anime is One Piece(obviously) My oshi(Yes, I have an oshi, deal with it) is Kamil_Tsubaki -stuff you should look for- * int overflow, array bounds * special cases (n=1?) * do something instead of nothing and stay organized * WRITE STUFF DOWN * DON'T GET STUCK ON ONE APPROACH continue - skip the rest in the loop */ int travelTime(int N, int M, int L, int A[], int B[], int T[]) { graph G; G.prep(N); for (i = 0; i < M; i++) { G.adde(A[i], B[i], T[i]); } vector <int> radis; int ans = 0; for (i = 0; i < N; i++) { if (G.used[i]) { continue; } G.path.clear(); G.DFS(i); int mx = 0, u = i; for (auto v : G.path) { G.used[v] = false; if (mx < G.dist[v]) { mx = G.dist[v]; u = v; } G.dist[v] = 0; G.par[v] = -1; } G.path.clear(); G.DFS(u); mx = 0; for (auto v : G.path) { if (mx < G.dist[v]) { mx = G.dist[v]; u = v; } } ans = max(ans, mx); int R = mx, cur = u; while (cur != -1) { int dist1 = G.dist[cur], dist2 = mx - G.dist[cur]; R = min(R, max(dist1, dist2)); cur = G.par[cur]; } radis.push_back(R); } sort(radis.begin(), radis.end(), greater<int>()); if ((int)radis.size() >= 2) { ans = max(ans, radis[0] + radis[1] + L); } if ((int)radis.size() >= 3) { ans = max(ans, radis[1] + radis[2] + 2 * L); } return ans; } int GCD(int A, int B) { if (!A) { return B; } return GCD(B % A, A); } int LCM(int A, int B) { return A * B / GCD(A, B); } int power(int base, int exponent) { int res = 1; while (exponent) { if (exponent & 1) { res *= base; } base *= base; exponent >>= 1; } return res; } /* $$$$$$$$\ $$$$$$$$\ $$ _____|\____$$ | $$ | $$ / $$$$$\ $$ / $$ __| $$ / $$ | $$ / $$$$$$$$\ $$$$$$$$\ \________|\________| */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...