Guest User

Untitled

a guest
Feb 2nd, 2020
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.76 KB | None | 0 0
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<vector>
  4. #include<cstring>
  5. #include<math.h>
  6. using namespace std ;
  7.  
  8. #define f(i,s,n) for(int i=s;i<n;i++)
  9. #define X first
  10. #define Y second
  11. #define MAXN 200005
  12.  
  13. typedef long long ll ;
  14. #define pii pair<ll,ll>
  15. ll  depth[MAXN], mcd[MAXN];
  16. ll dp[MAXN][20][2] ;
  17. vector<pii> al[MAXN] ;
  18.  
  19. ll dfs1(int node,int par)
  20. {// to create the depth and mcd arrays
  21.     ll mcdV = 0  ;
  22.     depth[node] = depth[par]+1 ;
  23.     for(auto x:al[node])
  24.         if(x.X!=par)
  25.         {
  26.             dp[x.X][0][0] = node ;
  27.             dp[x.X][0][1] = x.Y ;
  28.             mcdV = max(mcdV,max(x.Y,x.Y+dfs1(x.X,node))) ;
  29.         }
  30.     return mcd[node] = mcdV ;
  31. }
  32. int main()
  33. {
  34.     ios::sync_with_stdio(0) ;
  35.     cin.tie(0) ;
  36.     int T;cin>>T;
  37.     while(T--)
  38.     {
  39.         int n,q ;cin>>n>>q;
  40.         f(i,0,n-1)
  41.         {
  42.             int u,v,w; cin>>u>>v>>w ;
  43.             al[u].emplace_back(v,w) ;
  44.             al[v].emplace_back(u,w) ;
  45.         }
  46.         memset(dp,-1,sizeof(dp)) ;
  47.         dp[1][0][0] = 0 ;//parent of node 1 is 0
  48.         dp[1][0][1] = -1e18 ;//distance of 1's parent from it is very loooww
  49.         dfs1(1,0) ;//dp[i][0][0], depth, mcd filled up now.
  50.         f(j,1,20) f(i,1,n+1) dp[i][j][0] = dp[dp[i][j-1][0]][j-1][0], dp[i][j][1] = dp[i][j-1][1]+dp[dp[i][j-1][0]][j-1][1] ;
  51.         //dp created for binary lifting.
  52.         f(i,0,q)
  53.         {
  54.             int u,v,x ;cin>>u>>v>>x ;
  55.             ll maxD = mcd[u]+x+mcd[v] ;
  56.             //check if the path to lca is greater than this.
  57.             if(depth[u]>depth[v]) swap(u,v) ;// u should  always be at the lower depth
  58.             int diff = depth[v]-depth[u] ;
  59.             long long dist = 0 ;
  60.             /*while(diff)//log(3e5)~20
  61.             {
  62.                 int jumpto = floor(log2(diff)) ;
  63.                 v = dp[v][jumpto][0] ;
  64.                 dist+=dp[v][jumpto][1] ;
  65.                 diff -= (1<<jumpto) ;
  66.             }*/
  67.             while(diff)
  68.             {
  69.                 int jumpto = diff&(-diff) ;
  70.                 v = dp[v][jumpto][0] ;
  71.                 dist+=dp[v][jumpto][1] ;
  72.                 diff-=jumpto ;
  73.             }
  74.             //reached the common level
  75.             for(int j=19;j>=0;j--)//20
  76.             {
  77.                 int av = dp[v][j][0] ;
  78.                 int uv = dp[u][j][0] ;
  79.                 if(av!=uv)
  80.                 {
  81.                     dist+=dp[v][j][1]+dp[u][j][1] ;//jumping simultaneously upwards
  82.                     v = av ;
  83.                     u = uv ;
  84.                 }
  85.             }
  86.             //parent of u and v is the lca
  87.             dist+=dp[v][0][1]+dp[u][0][1] ;
  88.             cout<<max(maxD,dist)<<"\n" ;
  89.  
  90.         }
  91.     }
  92.  
  93. }
  94. /*
  95. 1
  96. 7 3
  97. 1 2 1
  98. 1 3 -2
  99. 2 4 3
  100. 2 5 -4
  101. 5 7 5
  102. 3 6 6
  103. 2 3 1
  104. 5 4 2
  105. 5 6 0
  106.  */
Add Comment
Please, Sign In to add comment