悬关求调
查看原帖
悬关求调
741732
small_Dongpo楼主2024/7/29 13:58

rt

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

typedef long long l;
l n, k, x, y, d[50005], p[50005][20], diff[50005], a[50005];
vector<l> v[50005];

void dfs(l x, l dad) {
    d[x] = d[dad] + 1;
    p[x][0] = dad;
    for (l i(1); (1 << (i - 1)) <= d[x]; ++i) {
        p[x][i] = p[p[x][i - 1]][i - 1];
    }
    for (l y : v[x]) {
        if (y != dad) {
            dfs(y, x);
        }
    }
}

l lca(l x, l y) {
    if (d[x] < d[y]) swap(x, y);
    for (l i(16); i >= 0; --i) {
        if (d[p[x][i]] >= d[y]) {
            x = p[x][i];
        }
    }
    if (x == y) return x;
    for (l i(16); i >= 0; --i) {
        if (p[x][i] != p[y][i]) {
            x = p[x][i];
            y = p[y][i];
        }
    }
    return p[x][0];
}

void dfs2(l x, l dad) {
    for (l y : v[x]) {
        if (y == dad) continue;
        dfs2(y, x);
        a[x] += a[y];
    }
    a[x] += diff[x];
}

int main() {
    scanf("%lld%lld", &n, &k);
    for (l i(1); i <= n; ++i) {
        scanf("%lld%lld", &x, &y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(1, 0);
    while (--k > -1) {
        scanf("%lld%lld", &x, &y);
        l z(lca(x, y));
        diff[x]++;
        diff[p[z][0]]--;
        diff[y]++;
        diff[z]--;
    }
    dfs2(1, 0);
    l ans(0);
    for (l i(1); i <= n; ++i) {
        ans = max(ans, a[i]);
    }
    printf("%lld", ans);
    return 0;
}
2024/7/29 13:58
加载中...