Skip to content

Latest commit

 

History

History
87 lines (82 loc) · 2.75 KB

minoperationsqueries.md

File metadata and controls

87 lines (82 loc) · 2.75 KB

题目描述:

image

解决过程: 第361场周赛t4,没做出来

  • 倍增lca+计数

代码:

const int LOG = 15;
int deep[10020], p[10020][15], sum[10020][15][27];
class Solution {
public:
    vector<int> minOperationsQueries(int n, vector<vector<int>>& edges, vector<vector<int>>& queries) {
        vector<vector<pair<int,int>>> gragh(n, vector<pair<int,int>>());
        for (auto& edge : edges) {
            int s = edge[0], e = edge[1], w = edge[2];
            gragh[s].push_back({e,w});
            gragh[e].push_back({s,w});
        }       
        function<void(int,int)> dfs = [&](int u, int fa) {
            p[u][0] = fa;
            for (auto& [next, w] : gragh[u]) {
                if (next != fa) {
                    sum[next][0][w] = 1;
                    deep[next] = deep[u] + 1;
                    dfs(next, u);
                }
            }
        };
        memset(deep, 0, sizeof deep);
        memset(p, -1, sizeof p);
        memset(sum, 0, sizeof sum);
        dfs(0, -1);
        for (int i = 1; i < LOG; ++i) {
            for (int j = 0; j < n; ++j) {
                if (p[j][i-1] != -1) {
                    p[j][i] = p[p[j][i-1]][i-1];
                    for (int k = 1; k <= 26; ++k) {
                        sum[j][i][k] = sum[j][i-1][k] + sum[p[j][i-1]][i-1][k];
                    }
                }
            }
        }
        vector<int> ans;
        for (auto& v : queries) {
            int x = v[0], y = v[1];
            int cnt[27]{};
            if (deep[x] > deep[y]) {
                swap(x,y);
            }
            int path_length = deep[x] + deep[y];
            int diff = deep[y] - deep[x];
            for (int i = 0; i < LOG; ++i) {
                if (diff & (1 << i)) {
                    for (int j = 1; j <= 26; ++j) {
                        cnt[j] += sum[y][i][j];
                    }
                    y = p[y][i];
                }
            }
            if (x != y) {
                for (int i = LOG - 1; i >= 0; --i) {
                    int px = p[x][i], py = p[y][i];
                    if (px != py) {
                        for (int j = 1; j <= 26; ++j) {
                            cnt[j] += sum[x][i][j] + sum[y][i][j];
                        }
                        x = px;
                        y = py;
                    }
                }
                for (int j = 1; j <= 26; ++j) {
                    cnt[j] += sum[x][0][j] + sum[y][0][j];
                }
                x = p[x][0];
            }
            int lca = x;
            ans.push_back(path_length - 2 * deep[lca] - *max_element(cnt, cnt + 27));
        }
        return ans;
    }
};