제출 #1227877

#제출 시각아이디문제언어결과실행 시간메모리
1227877thewizardmanTorrent (COI16_torrent)C++20
31 / 100
2096 ms21832 KiB
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector") // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native") #include <bits/stdc++.h> using namespace std; // #include <ext/pb_ds/assoc_container.hpp> // #include <ext/pb_ds/tree_policy.hpp> // using namespace __gnu_pbds; // template<typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #define ll long long #define ull unsigned long long #define ld long double #define pii pair<int, int> #define pll pair<ll, ll> #define pli pair<ll, int> #define plpll pair<ll, pll> #define pipii pair<int, pii> #define plpii pair<ll, pii> #define pipll pair<int, pll> #define lll tuple<ll, ll, ll> #define iii tuple<int, int, int> #define lii tuple<ll, int, int> #define lli tuple<ll, ll, int> #define md 1000000007LL #define linf 0x3f3f3f3f3f3f3f3f #define inf 0x3f3f3f3f #define lninf (ll)0xc0c0c0c0c0c0c0c0 #define ninf (int)0xc0c0c0c0 #define bruh ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define ss << ' ' << #ifdef wizard #define usaco(x) #else #define usaco(x) ifstream cin(#x ".in"); ofstream cout(#x ".out"); #endif template<class T1, class T2> istream& operator>>(istream& in, pair<T1, T2>& p) { return in >> p.first >> p.second; } template<class T1, class T2> ostream& operator<<(ostream& out, const pair<T1, T2>& p) { return out << p.first << ' ' << p.second; } template<size_t I = 0, typename... Ts> typename enable_if<I == sizeof...(Ts), istream&>::type read_tuple(istream& in, tuple<Ts...>& t) { return in; } template<size_t I = 0, typename... Ts> typename enable_if<I < sizeof...(Ts), istream&>::type read_tuple(istream& in, tuple<Ts...>& t) { in >> get<I>(t); return read_tuple<I + 1>(in, t); } template<typename... Ts> istream& operator>>(istream& in, tuple<Ts...>& t) { return read_tuple(in, t); } template<size_t I = 0, typename... Ts> typename enable_if<I == sizeof...(Ts), void>::type write_tuple(ostream& out, const tuple<Ts...>&) {} template<size_t I = 0, typename... Ts> typename enable_if<I < sizeof...(Ts), void>::type write_tuple(ostream& out, const tuple<Ts...>& t) { if (I) out << ' '; out << get<I>(t); write_tuple<I + 1>(out, t); } template<typename... Ts> ostream& operator<<(ostream& out, const tuple<Ts...>& t) { write_tuple(out, t); return out; } template<typename T> istream& operator>>(istream& in, vector<T>& v) { for (auto& x : v) in >> x; return in; } template<typename T> ostream& operator<<(ostream& out, const vector<T>& v) { for (size_t i = 0; i < v.size(); ++i) out << (i ? " " : "") << v[i]; return out; } int n, a, b, f[300001], skibidi, ans = inf, dp[300001]; vector<int> adj[300001]; vector<pii> path; pii x; void dfs1(int u, int p) { f[u] = p; for (auto v: adj[u]) if (v != p) dfs1(v, u); } void dfs2(int u, int p) { for (auto v: adj[u]) if (v != p && make_pair(u, v) != x && make_pair(v, u) != x) dfs2(v, u); vector<int> vec; for (auto v: adj[u]) if (v != p && make_pair(u, v) != x && make_pair(v, u) != x) { vec.push_back(dp[v]); } sort(vec.begin(), vec.end(), greater<>()); for (int i = 0; i < vec.size(); i++) dp[u] = max(dp[u], vec[i] + i + 1); } int calc(pii e) { x = e; memset(dp, 0, sizeof dp); dfs2(a, 0); dfs2(b, 0); return max(dp[a], dp[b]); } int main() { bruh; cin >> n >> a >> b; for (int i = 1; i < n; i++) { static int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } dfs1(a, 0); skibidi = b; while (f[skibidi] != 0) { path.push_back({skibidi, f[skibidi]}); skibidi = f[skibidi]; } for (auto e: path) { ans = min(ans, calc(e)); } // cerr << path << '\n'; cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...