Submission #1133380

#TimeUsernameProblemLanguageResultExecution timeMemory
1133380steveonalexTorrent (COI16_torrent)C++20
100 / 100
69 ms23624 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; #define MASK(i) (1LL << (i)) #define GETBIT(mask, i) (((mask) >> (i)) & 1) #define ALL(v) (v).begin(), (v).end() #define block_of_code if(true) ll max(ll a, ll b){return (a > b) ? a : b;} ll min(ll a, ll b){return (a < b) ? a : b;} ll gcd(ll a, ll b){return __gcd(a, b);} ll lcm(ll a, ll b){return a / gcd(a, b) * b;} ll LASTBIT(ll mask){return (mask) & (-mask);} int pop_cnt(ll mask){return __builtin_popcountll(mask);} int ctz(ull mask){return __builtin_ctzll(mask);} int logOf(ull mask){return 63 - __builtin_clzll(mask);} mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);} double rngesus_d(double l, double r){ double cur = rngesus(0, MASK(60) - 1); cur /= MASK(60) - 1; return l + cur * (r - l); } template <class T1, class T2> bool maximize(T1 &a, T2 b){ if (a < b) {a = b; return true;} return false; } template <class T1, class T2> bool minimize(T1 &a, T2 b){ if (a > b) {a = b; return true;} return false; } template <class T> void printArr(T container, string separator = " ", string finish = "\n", ostream &out = cout){ for(auto item: container) out << item << separator; out << finish; } template <class T> void remove_dup(vector<T> &a){ sort(ALL(a)); a.resize(unique(ALL(a)) - a.begin()); } const int N = 3e5 + 69; int n, u, v; vector<int> graph[N]; int go(int u, int p){ vector<int> child; for(int v: graph[u]) if (v != p){ int cur = go(v, u); child.push_back(cur); } sort(ALL(child)); int ma = 0; int cnt = 0; while(child.size()){ maximize(ma, child.back() + ++cnt); child.pop_back(); } return ma; } int parent[N]; void dfs(int u, int p){ parent[u] = p; for(int v: graph[u]) if (v != p) dfs(v, u); } vector<int> get_chain(int u, int v){ vector<int> ans; dfs(u, 0); while(v != u){ ans.push_back(v); v = parent[v]; } ans.push_back(u); reverse(ALL(ans)); return ans; } int solve(){ cin >> n >> u >> v; for(int i = 1; i< n; ++i){ int u, v; cin >> u >> v; graph[u].push_back(v); graph[v].push_back(u); } if (u == v) return go(u, 0); vector<int> chain = get_chain(u, v); vector<bool> on_chain(n+1); for(int i: chain) on_chain[i] = true; int m = chain.size(); vector<vector<int>> jack(m); for(int i = 0; i < m; ++i){ int u = chain[i]; for(int v: graph[u]) if (!on_chain[v]){ int cur = go(v, u); jack[i].push_back(cur); } sort(ALL(jack[i]), greater<int>()); } int l = 0, r = n; while(l < r){ int mid = (l + r) >> 1; int t = 0; int L = -1, R = m; for(int i = 0; i < m; ++i){ int e = 0, ma_e = 0; bool continue_further = true; for(int j: jack[i]){ e++; if (j + e + t > mid) { continue_further = false; break; } else if (j + e + t == mid){ ma_e = e; } } if (continue_further == false) break; t += ma_e + 1; L = i; } t = 0; for(int i = m - 1; i >= 0; --i){ int e = 0, ma_e = 0; bool continue_further = true; for(int j: jack[i]){ e++; if (j + e + t > mid) { continue_further = false; break; } else if (j + e + t == mid){ ma_e = e; } } if (continue_further == false) break; t += ma_e + 1; R = i; } if (L + 1 >= R) r = mid; else l = mid + 1; } return l; } int main(void){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); clock_t start = clock(); cout << solve() << "\n"; cerr << "Time elapsed: " << clock() - start << "ms!\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...