90分,#3wa,下了数据好像没什么用,求大佬帮忙
查看原帖
90分,#3wa,下了数据好像没什么用,求大佬帮忙
572923
rnmpa楼主2022/2/7 05:18
#include<stdio.h>
#include<string.h>
#define N 300005
#define M 25
typedef struct edge{
    int to, next;
}edge;
edge e[N<<1];
int n, way[N], head[N], tot, val[N], p[N][M], depth[N], lg[N], w[N];
void add(int u, int v){
    e[++tot].next = head[u]; e[tot].to = v;
    head[u] = tot;
    e[++tot].next = head[v]; e[tot].to = u;
    head[v] = tot;
}
void dfs(int u, int fa){
    depth[u] = depth[fa] + 1; p[u][0] = fa;
    for(int i = 1; i <= lg[depth[u]]; i++)
        p[u][i] = p[p[u][i - 1]][i - 1];
    for(int i = head[u]; i; i = e[i].next){
        int v = e[i].to; 
        if(v == fa) continue;
        dfs(v, u);
    }
}
void search(int fa, int u){
    for(int i = head[u]; i; i = e[i].next){
        int v = e[i].to;
        if(fa == v) continue;
        search(u, v);
        w[u] += w[v];
    }
}
void swap(int*a, int*b){int t = *a; *a = *b; *b = t;}
int lca(int u, int v){
    if(depth[u] < depth[v]) swap(&u, &v);
    int d = depth[u] - depth[v], i = 0;
    while(d){
        if(d&1) u = p[u][i];
        i++; d >>= 1;
    }
    if(u == v) return u;
    for(i = lg[depth[u]]; ~i; --i){
        if(p[u][i] != p[v][i]){
            u = p[u][i]; v = p[v][i];
        }
    }
    return p[u][0];
}
int main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
        scanf("%d", &way[i]);
    int u, v;
    for(int i = 1; i < n; i++){
        scanf("%d%d", &u, &v);
        add(u, v);
    }
    for(int i = 1; i <= n; i++)
        lg[i] = lg[i - 1] + (1<<lg[i - 1] == i);
    dfs(1, 0);
    int t, f;
    for(int i = 1; i < n; i++){
        u = way[i]; v = way[i + 1]; t = lca(u, v);
        f = p[t][0];
        val[u]++; val[v]++; val[t]--; val[f]--;
    }
    memcpy(w, val, sizeof(int) * n + 1);
    search(0, 1);
    for(int i = 1; i <= n; i++)
        printf("%d\n",(i == way[1])? w[i] : w[i] - 1);
    return 0;
}
2022/2/7 05:18
加载中...