Advertisement
deadwing97

Untitled

Oct 26th, 2019
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.36 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MX = (1<<20);
  5. const int MXL = 20;
  6.  
  7. int n;
  8.  
  9. vector < pair < int , int > > E;
  10.  
  11. int depth[MX] , par[MXL][MX];
  12.  
  13. vector < int > v[MX];
  14.  
  15. pair < int , int > best[MX][3];
  16.  
  17. pair < int , int > inc(pair < int , int > a){
  18.     return {a.first + 1 , a.second};
  19. }
  20. void Pdfs(int x , int p){
  21.     int nxt , C , sz=v[x].size();
  22.     best[x][0] = {0 , x};
  23.     best[x][1] = {-1 , 0};
  24.     best[x][2] = best[x][1];
  25.     for(int j=0;j<sz;j++){
  26.         nxt=v[x][j];
  27.         if(nxt == p) continue;
  28.         depth[nxt]=depth[x]+1;
  29.         par[0][nxt]=x;
  30.         Pdfs(nxt , x);
  31.  
  32.         if(inc(best[nxt][0]) > best[x][2]) best[x][2] = inc(best[nxt][0]);
  33.         if(best[x][2] > best[x][1]) swap(best[x][2] , best[x][1]);
  34.         if(best[x][1] > best[x][0]) swap(best[x][1] , best[x][0]);
  35.  
  36.     }
  37. }
  38. void process(){
  39.     for(int j=1;j<MXL;j++)
  40.         for(int i=1;i<=n;i++)
  41.             par[j][i]=par[j-1][par[j-1][i]];
  42. }
  43. int Kth(int x , int K){
  44.     int node=x;
  45.     for(int j=0;j<MXL;j++)
  46.         if((K&(1<<j)))
  47.             node=par[j][node];
  48.     return node;
  49. }
  50. int LCA(int x , int y){
  51.     if(depth[x] < depth[y]) swap(x , y);
  52.     x = Kth(x , depth[x] - depth[y]);
  53.     if(x == y) return x;
  54.     for(int j = MXL - 1 ; j >= 0 ; j--)
  55.         if(par[j][x] != 0 && par[j][y] != 0 && par[j][x] != par[j][y])
  56.             x = par[j][x] , y = par[j][y];
  57.     return par[0][x];
  58. }
  59.  
  60. int DIS(int x , int y){
  61.     return depth[x] + depth[y] - 2 * depth[LCA(x , y)];
  62. }
  63.  
  64.  
  65. int main() {
  66.  
  67.     T = readT; //read T here
  68.  
  69.  
  70.     while(T--){
  71.  
  72.         n = readn(); // read n here
  73.         QN = readQN(); //read QN here
  74.  
  75.         for(int j = 0 ; j < MXL ; j++)
  76.             for(int i = 1 ; i <= n ; i++)
  77.                 par[j][i] = 0;
  78.         for(int j = 1 ; j <= n ; j++)
  79.             v[j].clear();
  80.         for(int j = 1 ; j < n ; j++){
  81.             int a = read(); //read a
  82.             int b = readb(); //read b
  83.  
  84.             v[a].push_back(b);
  85.             v[b].push_back(a);
  86.         }
  87.  
  88.         depth[1] = 1;
  89.         Pdfs(1 , -1);
  90.         process();
  91.  
  92.         for(int j = 1 ; j <= QN ; j++){
  93.             int a = reada();
  94.             int da = readda();
  95.             int b = readb();
  96.             int db = readdb();
  97.  
  98.             int x = readanswer();
  99.             assert(dis(x , a) == da && dis(x , b) == db);
  100.         }
  101.  
  102.  
  103.     }
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement