萌新求助,树上差分这题,本机WA提交WA
查看原帖
萌新求助,树上差分这题,本机WA提交WA
1023961
Ryzen_9_9950X3D楼主2024/9/29 22:08
#include <bits/stdc++.h>
using namespace std;
#define N 300005
vector<int> graph[N];
int ith[N][30],qz[N],z_qz[N],deep[N];
void dfs(int g,int fa,int depth)
{
    for(int i = 0;i < graph[g].size();i++)
    {
        if(graph[g][i] != fa)
        {
            ith[graph[g][i]][0] = g;
            deep[graph[g][i]] = depth + 1;
            dfs(graph[g][i],g,depth + 1);
        }
    }
}
int dfs2(int g,int fa)
{
    z_qz[g] = qz[g];
    for(int i = 0;i < graph[g].size();i++)
    {
        if(graph[g][i] != fa) z_qz[g] += dfs2(graph[g][i],g);
    }
    return z_qz[g];
}
int lca(int u,int v)
{
    int k = 0;
    int q = deep[u] - deep[v];
    if(q < 0)
    {
        q = -q;
        int y = 0;
        while(q)
        {
            if(q & 1) v = ith[v][y];
            q >>= 1;
            y++;
        }
    }
    else
    {
        int y = 0;
        while(q)
        {
            if(q & 1) u = ith[u][y];
            q >>= 1;
            y++;
        }
    }
    if(u == v)
    {
        return u;
    }
    while(u != v)
    {
        int l = 0,r = 30;
        while(l <= r)
        {
            int mid = (l + r) >> 1;
            if(ith[u][mid] != ith[v][mid]) l = mid + 1;
            else r = mid - 1;
        }
        u = ith[u][max(r,0)];
        v = ith[v][max(r,0)];
    }
    return u;
}
int ss[N];
signed main()
{
    int n,m,root = 1;
    cin >> n;
    int h,k;
    for(int i = 1;i <= n;i++) cin >> ss[i];
    for(int i = 1;i < n;i++)
    {
        cin >> h >> k;
        graph[h].push_back(k);
        graph[k].push_back(h);
    }
    dfs(1,-1,1);
    for(int i = 0;i < 30;i++) ith[root][i] = root;
    for(int i = 1;i < 30;i++)
    {
        for(int j = 2;j <= n;j++)
        {
            ith[j][i] = ith[ith[j][i - 1]][i - 1];
        }
    }
    for(int i = 1;i < n;i++)
    {
        h = ss[i],k = ss[i + 1];
        int l = lca(h,k);
        qz[h]++;
        qz[k]++;
        qz[l]--;
        qz[ith[l][0]]--;
    }
    qz[ss[n]]--;
    dfs2(1,-1);
    for(int i = 1;i <= n;i++) cout << z_qz[i] << endl;
    return 0;
}
2024/9/29 22:08
加载中...