Advertisement
wym1111

Untitled

Sep 5th, 2023
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define endl '\n'
  6.  
  7. const int maxn = 1e5 + 10;
  8.  
  9. int n;
  10. ll a[maxn];
  11. vector<int>t[maxn];
  12. vector<int> g[maxn];
  13.  
  14. int dep[maxn], totdfn, dfn[maxn], f[maxn][20];
  15.  
  16. ll dp[maxn];
  17.  
  18. struct Node {
  19.     int id, dep, dfn;
  20. } node[maxn];
  21.  
  22.  
  23.  
  24. void dfs0 (int x, int fa) {
  25.     dfn[x] = ++ totdfn;
  26.     dep[x] = dep[fa] + 1;
  27.     node[x].id = x; node[x].dfn = dfn[x]; node[x].dep = dep[x];
  28.     f[x][0] = fa;
  29.     for (int i = 1; i < 20; i ++) {
  30.         f[x][i] = f[f[x][i - 1]][i - 1];
  31.     }
  32.    
  33.     for (auto y: t[x]) {
  34.         if (y == fa) continue;
  35.         dfs0(y, x);
  36.     }
  37. }
  38.  
  39. int lca(int x, int y) {
  40.     while (dep[x] > dep[y]) {
  41.         for (int i = 19; i >= 0; i --) {
  42.             if (dep[f[x][i]] >= dep[y]) x = f[x][i];
  43.         }
  44.     }
  45.     while (dep[y] > dep[x]) {
  46.         for (int i = 19; i > 0; i --) {
  47.             if (dep[f[y][i]] >= dep[x]) y = f[y][i];
  48.         }
  49.     }
  50.     if (x == y) return x;
  51.     for (int i = 19; i > 0; i --) {
  52.         if (f[x][i] != f[y][i]) {
  53.             x = f[x][i];
  54.             y = f[y][i];
  55.         }
  56.     }
  57.     return f[x][0];
  58. }
  59.  
  60. ll mi[maxn][20], lg[maxn];
  61. void pre () {
  62.     lg[1] = 0;
  63.     lg[2] = 1;
  64.     for (int i = 3; i <= n; i ++) {
  65.         lg[i] = lg[i >> 1] + 1;
  66.     }
  67.     for (int i = 0; i < n; i ++) mi[i][0] = a[i];
  68.     for (int j = 1; j < 20; j ++) {
  69.         for (int i = 0; i + (1 << (j - 1)) < n; i ++) {
  70.             mi[i][j] = min (mi[i][j - 1], mi[i + (1 << (j - 1))][j - 1]);
  71.         }
  72.     }
  73. }
  74.  
  75. ll getmina(int l, int r) {
  76.     int s = lg[r - l + 1];
  77.     return min (mi[l][s], mi[r - (1 << s) + 1][s]);
  78. }
  79.  
  80. void dfs(int x, int fa, int d) {
  81.     ll sum = 0;
  82.     for (auto y: g[x]) {
  83.         dfs(y, x, d);
  84.         sum += dp[x];
  85.     }
  86.     if (sum == 0) sum = a[0];
  87.     dp[x] = min (sum, getmina(d - dep[x], d - dep[fa]));
  88. }
  89.  
  90. void solve () {
  91.     cin >> n;
  92.     for (int i = 1; i <= n; i ++) {
  93.         cin >> a[i];
  94.     }
  95.     pre();
  96.    
  97.     for (int i = 1; i < n; i ++) {
  98.         int u, v;
  99.         cin >> u >> v;
  100.         t[u].push_back(v);
  101.         t[v].push_back(u);
  102.     }
  103.     totdfn = 0;
  104.     dfs0(1, 0);
  105.     sort(node + 1, node + 1 + n, [&](Node x, Node y){
  106.         if (x.dep == y.dep) return x.dfn < y.dfn;
  107.         return x. dep < y.dep;
  108.     });
  109.     int now = 1, tmp = 1;
  110.     vector<int> vt;
  111.     ll ans = 0;
  112.     while (now <= n) {
  113.         vt.push_back(1);
  114.         vector<int> vec;
  115.         while (now <= n && tmp == node[now].dep) {
  116.             vt.push_back(node[now].id);
  117.             now ++;
  118.         }
  119.         vec = vt;
  120.         sort(vt.begin(), vt.end(), [&](int x, int y){return dfn[x] < dfn[y];});
  121.         for (int i = 1; i < vt.size() - 1; i ++) {
  122.             int u = vt[i], v = vt[i + 1];
  123.             int _lca = lca(u, v);
  124.             vec.push_back(_lca);
  125.         }
  126.         sort(vec.begin(), vec.end(), [&](int x,int y){return dfn[x] < dfn[y];});
  127.         int len = unique(vec.begin(), vec.end()) - vec.begin();
  128.         vt.clear();
  129.         for (int i = 1; i < len; i ++) {
  130.             int u = vec[i - 1], v = vec[i];
  131.             int _lca = lca(u, v);
  132.             vt.push_back(_lca);
  133.             g[_lca].push_back(v);
  134.         }
  135.         dfs(1, 0, tmp);
  136.         ans += dp[1];
  137.         tmp ++;
  138.         for (auto x: vt) {
  139.             g[x].clear();
  140.         }
  141.         vt.clear();
  142.     }
  143. }
  144.  
  145. signed main () {
  146.     ios::sync_with_stdio(false);
  147.     cin.tie(nullptr);
  148.     int _ = 1;
  149.     cin >> _;
  150.     while (_ --) { 
  151.         solve();
  152.     }
  153.    
  154.     return 0;
  155. }
  156.  
  157. /*
  158. 3
  159. 3
  160. 1 2 3
  161. 3
  162. 1 1 1
  163. 5
  164. 1 2323 534 534 5
  165. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement