求助!!!我这道题用树上差分,但就是通过不了,本人也找不出代码的问题
查看原帖
求助!!!我这道题用树上差分,但就是通过不了,本人也找不出代码的问题
1079368
Climb1104楼主2024/3/7 16:59
#include <iostream>

using namespace std;

const int N = 3e5 + 10;
const int M = 2 * N;
struct edge
{
    int to, ne;
} e[M];
int h[N], idx;
int fa[N][31], dep[N];
int a[N], x, y, n, t;
int ans[N]; // 记录走过的次数
void add(int a, int b)
{
    e[++idx] = {b, h[a]};
    h[a] = idx;
}
void dfs(int u, int f)
{
    dep[u] = dep[f] + 1;
    fa[u][0] = f;
    for (int i = 0; i < 30; i++)
    {
        fa[u][i + 1] = fa[fa[u][i]][i];
    }
    for (int i = h[u]; i; i = e[i].ne)
    {
        if (e[i].to != f)
        {
            dfs(e[i].to, u);
        }
    }
}
int lca(int x, int y)
{
    if (dep[x] < dep[y])
        swap(x, y);
    for (int i = 30; i >= 0; i--)
    {
        if (dep[fa[x][i]] >= dep[y])
        {
            x = fa[x][i];
        }
    }
    if (x == y)
        return x;
    for (int j = 30; j >= 0; j--)
    {
        if (fa[x][j] != fa[y][j])
        {
            x = fa[x][j], y = fa[y][j];
        }
    }
    return fa[x][0];
}
void dfs2(int u, int f)
{
    for (int i = h[u]; i; i = e[i].ne)
    {
        int v = e[i].to;
        if (v == f)
            continue;
        dfs2(v, u);
        ans[u] += ans[v];
    }
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        // cin >> a[i];
        scanf("%d", &a[i]);
    }
    for (int j = 1; j <= n - 1; j++)
    {
        // cin >> x >> y;
        scanf("%d%d", &x, &y);
        add(x, y);
        add(y, x);
    }
    dfs(1, 0);
    for (int k = 1; k <= n - 1; k++)
    {
        int x = a[k], y = a[k + 1];
        int l = lca(x, y);
        ++ans[x], ++ans[y];
        --ans[l], --ans[fa[l][0]];
    }
    dfs2(1, 0);
    for (int i = 1; i <= n; i++)
    {
        if (i == 1)
            // cout << ans[i] << endl;
            printf("%d\n", ans[i]);
        else
            // cout << ans[i] - 1 << endl;
            printf("%d\n", ans[i] - 1);
    }
    return 0;
}
2024/3/7 16:59
加载中...