Advertisement
Guest User

Cosa trocoloca

a guest
Jun 17th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.62 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <vector>
  5. using namespace std;
  6. vector<vector< int > > Ary;
  7. long long An[100001][18], Dis[100001][18], P[100001], DPK[100001], DP2[19];
  8. long long Query(int a,int b)
  9. {
  10.     if(a == b)
  11.         return 0;
  12.     long long r = 0;
  13.     if(P[a]!=P[b])
  14.     {
  15.         if(P[a] > P[b])
  16.             swap(a,b);
  17.         long long k = DPK[b], d = P[b] - P[a];
  18.         while(d)
  19.         {
  20.       //      cout<<k<<" "<<d<<"  "<<DP2[k]<<" "<<r<<"  "<<Dis[b][k]<<endl;
  21.  
  22.             if(DP2[k] <= d)
  23.             {
  24.                 d -= DP2[k];
  25.                 r += Dis[b][k];
  26.                 b = An[b][k];
  27.             }
  28.             k--;
  29.         }
  30.     }
  31.     int k = DPK[P[a]];
  32.     //cout<<r<<"---"<<a<<"  "<<b<<endl;
  33.     if(a == b)
  34.         return r;
  35.     while(k>=0)
  36.     {
  37.         //cout<<a<<"  "<<b<<"  "<<An[a][k]<<"  "<<An[b][k]<<" | | "<<r<<" - "<<k<<endl;
  38.         if(An[a][k]!=An[b][k])
  39.         {
  40.             r += Dis[a][k] + Dis[b][k];
  41.             a = An[a][k], b = An[b][k];
  42.         }
  43.         k--;
  44.     }
  45.     r+= Dis[a][0] + Dis[b][0];
  46.     return r;
  47. }
  48. void DFS(int n,int d)
  49. {
  50.     P[n] = d;
  51.     for(int i = 1;i<18;i++)
  52.     {
  53.         An[n][i] = An[An[n][i-1]][i-1];
  54.         Dis[n][i] = Dis[An[n][i-1]][i-1] + Dis[n][i-1];
  55.     }
  56.     for(auto k : Ary[n])
  57.         DFS(k,d+1);
  58. }
  59. void Caso(int N)
  60. {
  61.     Ary.clear();
  62.     Ary.resize(N,vector<int> (0));
  63.     memset(An,0,sizeof(An));
  64.     memset(Dis,0,sizeof(Dis));
  65.     memset(P,0,sizeof(P));
  66.     for(int i = 1;i<N;i++)
  67.     {
  68.         int a,l;
  69.         scanf("%d %d",&a,&l);
  70.        // cout<<"Leido un nodo -------------"<<endl;
  71.         An[i][0] = a, Dis[i][0] = l;
  72.         Ary[a].push_back(i);
  73.     }
  74.     DFS(0,0);
  75.     int Q;
  76.     scanf("%d",&Q);
  77.     for(int i = 0;i<Q;i++)
  78.     {
  79.         int a,b;
  80.         scanf("%d %d",&a,&b);
  81.         printf("%lld",Query(a,b));
  82.         if(i<Q-1)
  83.             printf(" ")
  84.     }
  85.     //printf("\n");
  86. }
  87. int main()
  88. {
  89.     memset(DP2,0,sizeof(DP2)), memset(DPK,0,sizeof(DPK));
  90.     for(int i = 1, k = 0;i<100000;i*=2,k++)
  91.     {
  92.         DPK[i] = 1;
  93.         DP2[k] = i;
  94.     }
  95.  
  96.     for(int i = 1;i<100000;i++)
  97.         DPK[i]+=DPK[i-1];
  98.     int n;
  99.     scanf("%d",&n);
  100.     while(n)
  101.     {
  102.         //cout<<"--------"<<endl;
  103.         Caso(n);
  104.         //cout<<"--------"<<endl;
  105.         scanf("%d",&n);
  106.         if(n)
  107.             printf("\n");
  108.     }
  109. }
  110. /*
  111. 6
  112. 0 8
  113. 1 7
  114. 1 9
  115. 0 3
  116. 4 2
  117. 4
  118. 2 3
  119. 5 2
  120. 1 4
  121. 0 3
  122. 2
  123. 0 1
  124. 2
  125. 1 0
  126. 0 1
  127. 6
  128. 0 1000000000
  129. 1 1000000000
  130. 2 1000000000
  131. 3 1000000000
  132. 4 1000000000
  133. 15
  134. 5 0
  135. 4 0
  136. 3 0
  137. 2 0
  138. 1 0
  139. 5 1
  140. 4 1
  141. 3 1
  142. 2 1
  143. 5 2
  144. 4 2
  145. 3 2
  146. 5 3
  147. 4 3
  148. 5 4
  149. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement