Fshl0

Untitled

Mar 16th, 2022
841
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define F first
  3. #define S second
  4. #define pb push_back
  5.  
  6. using namespace std;
  7. typedef long long ll;
  8. typedef pair <int, int> pii;
  9.  
  10. #include <ext/pb_ds/assoc_container.hpp>
  11. #include <ext/pb_ds/tree_policy.hpp>
  12. using namespace __gnu_pbds;
  13.  
  14. #define ordered_set tree<pair<ll,int>, null_type,less<pair<ll,int>>, rb_tree_tag,tree_order_statistics_node_update>
  15.  
  16. const int INF = 1e8;
  17. const int mxN = 1e5 + 9;
  18. const int mxM = 5e4 + 9;
  19. const int MOD = 998244353;
  20.  
  21. vector <int> dfsOrder, adj[mxN];
  22. int dp[mxN][1 << 7], r[mxN], sz[mxN][7], d[mxN];
  23.  
  24. void goDFS (int v, int p) {
  25.     dfsOrder.pb (v);
  26.     sz[v][d[v]] = 1;
  27.    
  28.     for (auto u: adj[v]) {
  29.         if (u == p)
  30.             continue;
  31.        
  32.         goDFS (u, v);
  33.         for (int i = 0; i <= 5; i++)
  34.             sz[v][i] += sz[u][i];
  35.     }
  36.    
  37.     r[v] = dfsOrder.size() - 1;
  38.     return;
  39. }
  40.  
  41. void solve () {
  42.     int n;
  43.     cin >> n;
  44.    
  45.     for (int i = 1; i <= n; i++)
  46.         cin >> d[i];
  47.    
  48.     int two;
  49.     cin >> two;
  50.    
  51.     for (int i = 1; i < n; i++) {
  52.         int u, v;
  53.         cin >> u >> v;
  54.        
  55.         adj[u].pb (v);
  56.         adj[v].pb (u);
  57.     }
  58.    
  59.     goDFS (1, -1);
  60.     dfsOrder.push_back (0);
  61.    
  62.     for (int i = 0; i < mxN; i++)
  63.         for (int j = 0; j < (1 << 7); j++)
  64.             dp[i][j] = -INF;
  65.    
  66.     dp[dfsOrder.size() - 1][0] = 0;
  67.     for (int i = dfsOrder.size() - 2; i >= 0; i--) {
  68.        
  69.         int v = dfsOrder [i];
  70.         for (int msk = 0; msk < (1 << 7); msk++) {
  71.             dp[i][msk] = dp[i + 1][msk];
  72.            
  73.             int vMask = 0, total = 0;
  74.             for (int j = 0; j <= 5; j++) {
  75.                 vMask |= ((sz[v][j] & 1) << j);
  76.                 total += sz[v][j];
  77.             }
  78.            
  79.             int prevMask = msk ^ vMask;
  80.             dp[i][msk] = max (dp[i][msk], dp[r[v] + 1][prevMask] + total);
  81.         }
  82.     }
  83.        
  84.     int res = dp[0][0];
  85.     for (int i = 0; i <= 5; i++)
  86.         res = max (res, dp[0][1 << i]);
  87.    
  88.     cout << res << "\n";
  89.     return;
  90. }
  91.  
  92. int main () {
  93.     int t = 1;
  94.     //cin >> t;
  95.        
  96.     //preCalc ();
  97.     while (t--) {
  98.         //initialize common variables
  99.        
  100.         //go solve
  101.         solve ();
  102.     }
  103.        
  104.     return 0;
  105. }
  106.  
  107. /*
  108.  *
  109.  *
  110.  *
  111.  *
  112. 12
  113. 5 1 3 2 2 1 4 4 4 3 4 3
  114. 2
  115. 1 2
  116. 1 3
  117. 2 4
  118. 2 5
  119. 3 6
  120. 3 7
  121. 6 8
  122. 6 9
  123. 7 10
  124. 7 11
  125. 10 12
  126.  
  127.  *
  128.  */
  129.  
Advertisement
Add Comment
Please, Sign In to add comment