Advertisement
FHVirus

TIOJ 2172

Aug 29th, 2021
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.26 KB | None | 0 0
  1. // Knapsack DP is harder than FFT.
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll;
  5. #define ff first
  6. #define ss second
  7. #define pb emplace_back
  8. #define AI(x) begin(x),end(x)
  9. template<class I>bool chmax(I&a,I b){return a<b?(a=b,true):false;}
  10. template<class I>bool chmin(I&a,I b){return b<a?(a=b,true):false;}
  11. #ifdef OWO
  12. #define debug(args...) SDF(#args, args)
  13. #define OIU(args...) ostream& operator<<(ostream&O,args)
  14. #define LKJ(S,B,E,F) template<class...T>OIU(S<T...>s){O<<B;int c=0;for(auto i:s)O<<(c++?", ":"")<<F;return O<<E;}
  15. LKJ(vector,'[',']',i)LKJ(deque,'[',']',i)LKJ(set,'{','}',i)LKJ(multiset,'{','}',i)LKJ(unordered_set,'{','}',i)LKJ(map,'{','}',i.ff<<':'<<i.ss)LKJ(unordered_map,'{','}',i.ff<<':'<<i.ss)
  16. template<class...T>void SDF(const char* s,T...a){int c=sizeof...(T);if(!c){cerr<<"\033[1;32mvoid\033[0m\n";return;}(cerr<<"\033[1;32m("<<s<<") = (",...,(cerr<<a<<(--c?", ":")\033[0m\n")));}
  17. template<class T,size_t N>OIU(array<T,N>a){return O<<vector<T>(AI(a));}template<class...T>OIU(pair<T...>p){return O<<'('<<p.ff<<','<<p.ss<<')';}template<class...T>OIU(tuple<T...>t){return O<<'(',apply([&O](T...s){int c=0;(...,(O<<(c++?", ":"")<<s));},t),O<<')';}
  18. #else
  19. #pragma GCC optimize("Ofast")
  20. #define debug(...) ((void)0)
  21. #endif
  22.  
  23. const int kN = 100001;
  24. const int kL = 18;
  25.  
  26. int n, m;
  27. vector<int> adj[kN];
  28.  
  29. int dep[kN];
  30. int anc[kN][kL];
  31.  
  32. void dfs(int u, int p = -1){
  33.     for(int v: adj[u]){
  34.         if(v == p) continue;
  35.         anc[v][0] = u;
  36.         dep[v] = dep[u] + 1;
  37.         dfs(v, u);
  38.     }
  39. }
  40.  
  41. int lca(int u, int v){
  42.     if(dep[u] < dep[v]) swap(u, v);
  43.     for(int d = dep[u] - dep[v], l = 0; l < kL; ++l)
  44.         if(d >> l & 1) u = anc[u][l];
  45.     if(u == v) return u;
  46.  
  47.     for(int l = kL - 1; l >= 0; --l)
  48.         if(anc[u][l] != anc[v][l]){
  49.             u = anc[u][l];
  50.             v = anc[v][l];
  51.         }
  52.     return anc[u][0];
  53. }
  54.  
  55. signed main(){
  56.     ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  57.     cin >> n >> m;
  58.     for(int u, v, i = 1; i < n; ++i){
  59.         cin >> u >> v;
  60.         adj[u].pb(v);
  61.         adj[v].pb(u);
  62.     }
  63.     dfs(0);
  64.     for(int j = 1; j < kL; ++j)
  65.         for(int i = 0; i < n; ++i)
  66.             anc[i][j] = anc[anc[i][j-1]][j-1];
  67.  
  68.     for(int u, v, i = 0; i < m; ++i){
  69.         cin >> u >> v;
  70.         cout << dep[u] + dep[v] - 2 * dep[lca(u, v)] << '\n';
  71.     }
  72.  
  73.     return 0;
  74. }
  75.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement