Advertisement
deadwing97

TREEVERS

Sep 28th, 2019
892
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.39 KB | None | 0 0
  1.  
  2. #include<bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. const int MX = (1<<20);
  7.  
  8. int T , n;
  9.  
  10. int col[MX] , cnt[MX][2] , sz[MX];
  11.  
  12. vector < int > v[MX];
  13.  
  14. long long dp[MX];
  15.  
  16. bool cmp(pair < int , int > A , pair < int , int > B){
  17.     return 1ll * B.first * A.second < 1ll * A.first * B.second;
  18. }
  19. void dfs(int x , int p){
  20.  
  21.     dp[x] = 0;
  22.     sz[x] = 1;
  23.  
  24.     cnt[x][0] = cnt[x][1] = 0;
  25.  
  26.     cnt[x][col[x]]++;
  27.  
  28.     vector < pair < int , int > > vec;
  29.  
  30.     for(auto nxt : v[x]){
  31.         if(nxt == p) continue;
  32.         dfs(nxt , x);
  33.         cnt[x][0] += cnt[nxt][0];
  34.         cnt[x][1]+= cnt[nxt][1];
  35.         vec.push_back({cnt[nxt][0] , cnt[nxt][1]});
  36.         dp[x] += dp[nxt];
  37.         sz[x] += sz[nxt];
  38.     }
  39.  
  40.     sort(vec.begin() , vec.end() , cmp);
  41.  
  42.     int cur = col[x];
  43.  
  44.     for(auto pp : vec){
  45.         dp[x] += 1ll * pp.first * cur;
  46.         cur += pp.second;
  47.     }
  48. }
  49. int main(){
  50.     cin>>T;
  51.     int alln = 0;
  52.     while(T--){
  53.         cin>>n;
  54.         alln += n;
  55.         for(int j = 1 ; j <= n ; j++){
  56.             v[j].clear();
  57.         }
  58.         for(int j = 1 ; j <= n ; j++)
  59.             cin>>col[j];
  60.         for(int j = 1 ; j < n ; j++){
  61.             int a , b;
  62.             cin>>a>>b;
  63.             assert(a != b);
  64.             v[a].push_back(b);
  65.             v[b].push_back(a);
  66.         }
  67.         dfs(1 , -1);
  68.         assert(sz[1] == n);
  69.         cout<<dp[1]<<endl;
  70.  
  71.     }
  72.  
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement