Advertisement
hsiuyee

H. Alexandria Library

Apr 28th, 2023 (edited)
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.89 KB | None | 0 0
  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #include<bits/stdc++.h>
  4. using namespace std;
  5. #define ll long long
  6. #define int long long
  7. #define fastio ios::sync_with_stdio(false),cin.tie(0);
  8. #define eb emplace_back
  9. #define mkp make_pair
  10.  
  11. const ll MAXN=3e5+5;
  12.  
  13. ll n,Q,x,y;
  14. vector<ll> G[MAXN];
  15. ll dep[MAXN],sz[MAXN],fa[21][MAXN];
  16.  
  17. void dfs(ll now,ll pa){
  18.     sz[now]=1;
  19.     fa[0][now]=pa;
  20.     for(auto it:G[now]){
  21.         if(it!=pa){
  22.             dep[it]=dep[now]+1;
  23.             dfs(it,now);
  24.             sz[now]+=sz[it];
  25.         }
  26.     }
  27. }
  28.  
  29. void bulid_lca(ll root){
  30.     dep[root]=1;
  31.     dfs(root,root);
  32.     for(ll i=1;i<log2(n);i++){
  33.         for(ll j=1;j<=n;j++){
  34.             fa[i][j]=fa[i-1][fa[i-1][j]];
  35.         }
  36.     }
  37. }
  38.  
  39. ll lca(ll a,ll b){
  40.     if(dep[a]>dep[b]) swap(a,b);
  41.     ll gap=dep[b]-dep[a];
  42.     for(ll i=0;i<log2(n);i++){
  43.         if(gap>>i&1) b=fa[i][b];
  44.     }
  45.     if(a==b) return a;
  46.     for(ll i=20;i>=0;i--){
  47.         if(fa[i][a]!=fa[i][b]){
  48.             a=fa[i][a];
  49.             b=fa[i][b];
  50.         }
  51.     }
  52.     return fa[0][a];
  53. }
  54.  
  55. void init(){
  56.     cin>>n>>Q;
  57.     for(ll j=1;j<=n;j++){
  58.         G[j].clear();
  59.         for(ll i=0;i<21;i++){
  60.             fa[i][j]=1;
  61.         }
  62.     }
  63.     for(ll i=0;i<n-1;i++){
  64.         cin>>x>>y;
  65.         G[x].eb(y);
  66.         G[y].eb(x);
  67.     }
  68.     dfs(1,1);
  69.     bulid_lca(1);
  70. }
  71.  
  72. void solve(){
  73.     while(Q--){
  74.         cin>>x>>y;
  75.         ll ans=lca(x,y);
  76.         if((dep[x]+dep[y]-2*dep[ans])%2==1){
  77.             cout<<"0\n";
  78.             continue;
  79.         }
  80.         if(x==y){
  81.             cout<<n<<'\n';
  82.             continue;
  83.         }
  84.         if(dep[x]>dep[y]) swap(x,y);
  85.         ll gap=(dep[x]+dep[y]-2*dep[ans])/2;
  86.         ll mid=y;
  87.         for(ll i=20;i>=0;i--){
  88.             if(gap>>i&1) mid=fa[i][mid];
  89.         }
  90.         if(ans==mid){
  91.             gap--;
  92.             for(ll i=20;i>=0;i--){
  93.                 if(gap>>i&1){
  94.                     y=fa[i][y];
  95.                     x=fa[i][x];
  96.                 }
  97.             }
  98.             cout<<n-sz[y]-sz[x]<<'\n';
  99.         }
  100.         else{
  101.             gap--;
  102.             for(ll i=20;i>=0;i--){
  103.                 if(gap>>i&1) y=fa[i][y];
  104.             }
  105.             cout<<sz[mid]-sz[y]<<'\n';
  106.         }
  107.     }
  108. }
  109.  
  110. signed main(){
  111.     fastio 
  112.     freopen("library.in","r",stdin);
  113.     ll T;
  114.     cin>>T;
  115.     while(T--){
  116.         init();
  117.         solve();
  118.     }
  119.     return 0;
  120. }
Tags: JCPC 2022
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement