Kruskal重构树+LCA WA*30求调
查看原帖
Kruskal重构树+LCA WA*30求调
1383823
Cute_Elaina楼主2025/7/19 16:29
#include <bits/stdc++.h>
#define ll long long
#define N 501
#define M 500005
#define mod 998244353
#define all(a) a.begin(),a.end()
#define uniqueu(a) a.erase(unique(all(a)), a.end())
using namespace std;
mt19937_64 mrand(random_device{}());

int h, w, q;
int F[N][N], id[N][N];
ll f[M][31], dist[M], dep[M];
int cnt, len;

struct Edge {
    int u, v;
    ll w;
    bool operator < (const Edge &A) const {
        return w > A.w;
    }
} adj[M];

vector<int> edges[M];

struct DSU {
    int fa[20 * M];
    int find(int x) {
        return fa[x] == x ? x : fa[x] = find(fa[x]);
    }
    inline void merge(int x, int y, ll w) {
        int fx = find(x), fy = find(y);
        if (fx == fy)
            return;
        cnt++;
        fa[cnt] = cnt;
        edges[cnt].push_back(fx);
        edges[cnt].push_back(fy);
        fa[fx] = fa[fy] = cnt;
        dist[cnt] = w;
    }
} dsu;

inline void dfs(int p, int fa) {
    dep[p] = dep[fa] + 1;
    f[p][0] = fa;
    for (int i = 1; i <= 30; i++)
        f[p][i] = f[f[p][i - 1]][i - 1];
    for (auto &i : edges[p])
        dfs(i, p);
}

int LCA(int u, int v) {
    if (dep[u] < dep[v])
        swap(u, v);
    int c = dep[u] - dep[v];
    for (int i = 0; c; c /= 2, i++)
        if (c & 1)
            u = f[u][i];
    if (u == v)
        return u;
    for (int i = 30; i; i--)
        if (f[u][i] != f[v][i]) {
            u = f[u][i];
            v = f[v][i];
        }
    return f[u][0];
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> h >> w;
    for (int i = 1; i <= h; i++)
        for (int j = 1; j <= w; j++) {
            cin >> F[i][j];
            id[i][j] = ++cnt;
            if (i - 1 >= 1) {
                adj[++len].u = id[i][j];
                adj[len].v = id[i - 1][j];
                adj[len].w = min(F[i][j], F[i - 1][j]);
            }
            if (j - 1 >= 1) {
                adj[++len].u = id[i][j];
                adj[len].v = id[i][j - 1];
                adj[len].w = min(F[i][j], F[i][j - 1]);
            }
        }
    sort(adj + 1, adj + len + 1);
    for (int i = 1; i <= len; i++) {
        dsu.fa[i] = i;
        dist[i] = LONG_LONG_MAX;
    }
    for (int i = 1; i <= len; i++)
        dsu.merge(adj[i].u, adj[i].v, adj[i].w);
    dfs(cnt, 0);
    cin >> q;
    for ( ; q--; ) {
        int a, b, y, c, d, z;
        cin >> a >> b >> y >> c >> d >> z;
        if (a == c && b == d) {
            cout << abs(y - z) << "\n";
            continue;
        }
        int u = id[a][b], v = id[c][d];
        int lca = LCA(u, v);
        lca = min({dist[lca], 1ll * y, 1ll * z});
        cout << abs(y - lca) + abs(z - lca) << "\n";
    }
}
2025/7/19 16:29
加载中...