Advertisement
welleyth

UJGOI 2022 Day 3B

Aug 26th, 2022
767
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.16 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace __gnu_pbds;
  5. using namespace std;
  6.  
  7. #define int long long
  8. #define mp make_pair
  9. #define pb push_back
  10.  
  11. #pragma GCC optimize("Ofast")
  12. #pragma GCC optimize("unroll-loops")
  13. #pragma GCC target("avx2")
  14.  
  15. constexpr long long INF = (long long)1e18;
  16. constexpr int N = (int)3e5 + 111;
  17. constexpr int md = (int)998244353;
  18. constexpr int mdPower = (int)1e9+7 - 1;
  19. constexpr double eps = 1e-7;
  20.  
  21. typedef __int128 _uint;
  22. typedef long long ll;
  23.  
  24. mt19937_64 rnd(time(nullptr));
  25.  
  26. void add(int& a,int b){
  27.     a += b; if(a >= md) a -= md;
  28. }
  29. void sub(int& a,int b){
  30.     a -= b; while(a < 0) a += md;
  31. }
  32. void add(__int128& a,int b){
  33.     a += b;
  34. }
  35. void sub(__int128& a,int b){
  36.     a -= b;
  37. }
  38.  
  39. int bpow(int a,int b){
  40.     if(b == 0)
  41.         return 1;
  42.     if(b % 2 == 0){
  43.         int t = bpow(a,b>>1);
  44.         return 1ll*t*t%md;
  45.     }
  46.     return 1ll * a*bpow(a,b-1) % md;
  47. }
  48.  
  49. int inv(int a){
  50.     return bpow(a,md-2);
  51. }
  52.  
  53. vector<int> g[N];
  54. int diam[N];
  55. int ans = 0;
  56. multiset<int> st[2];
  57. int mxD[N];
  58.  
  59. int dfs1(int v,int pr = -1){
  60.     int mx[2],a;
  61.     mx[0] = mx[1] = 0;
  62.     for(auto& to : g[v]){
  63.         if(to == pr)
  64.             continue;
  65.         a = dfs1(to,v)+1;
  66.         diam[v] = max(diam[to],diam[to]);
  67.         if(a > mx[1])
  68.             swap(a,mx[1]);
  69.         if(mx[0] < mx[1])
  70.             swap(mx[0],mx[1]);
  71.         diam[v] = max(diam[v],diam[to]);
  72.     }
  73.     diam[v] = max(diam[v],mx[0] + mx[1]);
  74.     mxD[v] = mx[0];
  75.     return mx[0];
  76. }
  77.  
  78. int getDiam(multiset<int>& c){
  79.     int ans = 0;
  80.     auto it = (--c.end());
  81.     ans += *it;
  82.     it--;
  83.     ans += *it;
  84.     return ans;
  85. }
  86.  
  87. int getMax(multiset<int>& s){
  88.     return s.empty() ? 0 : *(--s.end());
  89. }
  90.  
  91. void dfs2(int v,int pr = -1,int dist = 0){
  92.     multiset<int> cur;
  93.     cur.insert(0);
  94.     cur.insert(0);
  95.     cur.insert(dist);
  96.     for(auto& to : g[v]){
  97.         if(to == pr)
  98.             continue;
  99.         cur.insert(mxD[to]+1);
  100.         st[0].insert(diam[to]);
  101.     }
  102.  
  103.     for(auto& to : g[v]){
  104.         if(to == pr)
  105.             continue;
  106.         cur.erase(cur.find(mxD[to]+1));
  107.         st[0].insert(getDiam(cur));
  108.         st[0].erase(st[0].find(diam[to]));
  109.         ans = max(ans,getMax(st[0])+diam[to]+1);
  110.         dfs2(to,v,*(--cur.end())+1);
  111.         st[0].erase(st[0].find(getDiam(cur)));
  112.         cur.insert(mxD[to]+1);
  113.         st[0].insert(diam[to]);
  114.     }
  115.     for(auto& to : g[v]){
  116.         if(to == pr)
  117.             continue;
  118.         st[0].erase(st[0].find(diam[to]));
  119.     }
  120.     return;
  121. }
  122.  
  123. void solve(){
  124.     int n;
  125.     cin >> n;
  126.  
  127.     for(int i = 2; i <= n; i++){
  128.         int a,b;
  129.         cin >> a >> b;
  130.         g[a].pb(b);
  131.         g[b].pb(a);
  132.     }
  133.  
  134.     dfs1(1);
  135.  
  136.     ans = diam[1];
  137.  
  138.     dfs2(1);
  139.  
  140.     cout << ans << "\n";
  141.  
  142.     return;
  143. }
  144.  
  145. signed main(){
  146.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  147.     int tests = 1;
  148. //    cin >> tests;
  149.     for(int test = 1; test <= tests; test++){
  150. //        cerr << "test = " << test << "\n";
  151.         solve();
  152.     }
  153.     return 0;
  154. }
  155. /**
  156. 10
  157. 1 2
  158. 1 3
  159. 1 4
  160. 2 5
  161. 3 6
  162. 2 7
  163. 2 8
  164. 8 9
  165. 4 10
  166.  
  167. **/
  168.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement