sudama_bera

lca,difference array on tree

Jul 27th, 2026
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. vector<vector<int>>g;
  5. const int N=1e5;
  6. const int mxe=22;
  7. int up[N][mxe];
  8. vector<int>par,dep,diff;
  9. vector<ll>ans;
  10. void dfs(int vert,int p=0,int d=0){
  11.     par[vert]=p;
  12.     dep[vert]=d;
  13.     for(auto&child:g[vert]){
  14.         if(child!=p){
  15.             dfs(child,vert,d+1);
  16.         }
  17.     }
  18. }
  19. int lift(int vert,int dist){
  20.     int node=vert;
  21.     for(int i=mxe-1;i>=0;i--){
  22.         if(node!=0){
  23.             if(dist&(1<<i)){
  24.                 node=up[node][i];
  25.             }
  26.         }
  27.     }
  28.     return node;
  29. }
  30. int lca(int u,int v){
  31.     u=lift(u,dep[u]-min(dep[u],dep[v]));
  32.     v=lift(v,dep[v]-min(dep[u],dep[v]));
  33.     if(u==v)return u;
  34.     for(int i=mxe-1;i>=0;i--){
  35.        if(up[u][i]!=up[v][i]){
  36.           u=up[u][i];
  37.           v=up[v][i];
  38.        }
  39.     }
  40.     return up[u][0];
  41. }
  42. ll dfs1(int vert,int p){
  43.     ll sum=1ll*diff[vert];
  44.     for(auto&child:g[vert]){
  45.         if(child!=p){
  46.             sum+=dfs1(child,vert);;
  47.         }
  48.     }
  49.     return ans[vert]=sum;
  50. }
  51. void solve(){
  52.   int n,k;cin>>n>>k;
  53.   par.resize(n+1,0);
  54.   dep.resize(n+1,0);
  55.   diff.resize(n+2,0);
  56.   ans.resize(n+1,0);
  57.   g.resize(n+1,vector<int>());
  58.   for(int i=0;i<n-1;i++){
  59.     int u,v;cin>>u>>v;
  60.     g[u].push_back(v);
  61.     g[v].push_back(u);
  62.   }
  63.   memset(up,0,sizeof(up));
  64.   dfs(1,0,0);
  65.   for(int i=1;i<=n;i++){
  66.     up[i][0]=par[i];
  67.   }
  68.   for(int i=1;i<mxe;i++){
  69.     for(int j=1;j<=n;j++){
  70.         if(up[j][i-1]!=0){
  71.             up[j][i]=up[up[j][i-1]][i-1];
  72.         }
  73.     }
  74.   }
  75.   for(int i=0;i<k;i++){
  76.     int u,v;cin>>u>>v;
  77.     int l=lca(u,v);
  78.    // cout<<l+1<<endl;
  79.    diff[u]++;diff[v]++;diff[l]--;diff[par[l]]--;
  80.   }
  81.   dfs1(1,0);
  82.   ll res=0;
  83.   for(int i=1;i<=n;i++){
  84.     res=max(ans[i],res);
  85.   }
  86.   cout<<res;
  87. }
  88. int main() {
  89. // freopen("haybales.in","r",stdin);
  90. // freopen("haybales.out","w",stdout);
  91.     ios_base::sync_with_stdio(false);
  92.     cin.tie(nullptr);
  93.     int t=1;
  94.    // cin>>t;
  95.     while(t--){
  96.         solve();
  97.     }
  98.     return 0;
  99. }
  100. //  for(int l=1;l<me;l++){
  101.  //   for(int i=0;i<n;i++){
  102.  //  if(up[i][l-1]!=-1)up[i][l]=up[up[i][l-1]][l-1];
  103. //   }
  104. // }
  105. /*
  106.   lift code:
  107.    int lift(int node,int distance){
  108.     for(int e=0;e<maxe;e++){
  109.      if(node!=-1){
  110.       if(distance&(1<<e)){
  111.        node=up[node][e];
  112.       }
  113.      }
  114.     }
  115.     return node;
  116.    }
  117. */
  118. //
Advertisement
Add Comment
Please, Sign In to add comment