Advertisement
pb_jiang

LC361T4

Sep 2nd, 2023
773
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. using a26i = array<int, 27>;
  2. class Solution {
  3.     constexpr static int log = 15;
  4.     struct Edge {
  5.         int v, w, next;
  6.     } es[20003];
  7.     int ecnt = 0;
  8.     int head[10003];
  9.     void init() {
  10.         memset(head, -1, sizeof(head));
  11.         ecnt = 0;
  12.     }
  13.     void insert(int u, int v, int w) {
  14.         es[ecnt] = {v, w, head[u]};
  15.         head[u] = ecnt++;
  16.        
  17.         es[ecnt] = {u, w, head[v]};
  18.         head[v] = ecnt++;
  19.     }
  20. public:
  21.     vector<int> minOperationsQueries(int n, vector<vector<int>>& edges, vector<vector<int>>& qs) {  
  22.         a26i val;
  23.         for (auto&x:val) x = 0;
  24.         vector<vector<a26i>> dp(n + 1, vector<a26i>(log, val));
  25.         vector<vector<int>> pa(n + 1, vector<int>(log));
  26.         vector<int> dep(n + 1);
  27.         init();
  28.         for (auto& e: edges) {
  29.             int u = e[0], v = e[1], w = e[2];
  30.             insert(u, v, w);
  31.         }
  32.         function<void(int, int, int)> dfs = [&](int u, int fa, int depth) {
  33.             dep[u] = depth;
  34.             for (int eid = head[u]; eid != -1; eid = es[eid].next) {
  35.                 int w = es[eid].w, v = es[eid].v;
  36.                 if (v == fa) continue;
  37.                 dp[v][0][w] += 1;
  38.                 pa[v][0] = u;
  39.                 dfs(v, u, depth + 1);
  40.             }
  41.         };
  42.         dfs(0, -1, 0);
  43.         for (int i = 1; i < log; ++i) {
  44.             for (int u = 0; u < n; ++u) {
  45.                 pa[u][i] = pa[pa[u][i-1]][i-1];
  46.                 a26i curr = dp[u][i-1];
  47.                 for (int j = 0; j <= 26; ++j)
  48.                     curr[j] += dp[pa[u][i-1]][i-1][j], assert(curr[j] >= 0);
  49.                 dp[u][i] = curr;
  50.             }
  51.         }
  52.  
  53.         function<int(int, int)> lca = [&](int u, int v) {
  54.             if (dep[u] < dep[v]) swap(u, v);
  55.             a26i cnt = val;
  56.             for (int st = log - 1; st >= 0; --st) {
  57.                 if (dep[pa[u][st]] >= dep[v]) {
  58.                     for (int i = 0; i <= 26; ++i)
  59.                         cnt[i] += dp[u][st][i], assert(cnt[i] >= 0);
  60.                     u = pa[u][st];
  61.                 }
  62.             }
  63.             if (u != v) {
  64.                 for (int st = log - 1; st >= 0; --st) {
  65.                     if (pa[u][st] != pa[v][st]) {
  66.                         for (int i = 0; i <= 26; ++i)
  67.                             cnt[i] += dp[u][st][i] + dp[v][st][i], assert(cnt[i] >= 0);
  68.                         u = pa[u][st], v = pa[v][st];
  69.                     }
  70.                 }
  71.                 for (int i = 0; i <= 26; ++i)
  72.                     cnt[i] += dp[u][0][i] + dp[v][0][i];
  73.             }
  74.            
  75.             int sum = 0;
  76.             for (int i = 0; i <= 26; ++i) sum += cnt[i];
  77.             // cout << "sum: " << sum << endl;
  78.             int ret = INT_MAX;
  79.             for (int i = 0; i <= 26; ++i) ret = min(ret, sum - cnt[i]);
  80.             return ret;
  81.         };
  82.        
  83.         vector<int> ans;
  84.         for (auto q: qs) {
  85.             int u = q[0], v = q[1];
  86.             ans.push_back(lca(u, v));
  87.         }
  88.         return ans;
  89.     }
  90. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement