WA了,10pts求助
查看原帖
WA了,10pts求助
117648
tuzhewen楼主2020/8/22 12:58

我用的是树上差分,不知道为什么就10pts了,给个反例也彳亍

#include<bits/stdc++.h>
using namespace std;
#define F(i,l,r) for(int i=l;i<=r;i++)
#define p_b push_back
const int N=3e5+5;
int n,u,v;
int a[N],sum[N];
int fa[N][43],dep[N];
vector<int> mp[N];
void dfs(int s) {
    dep[s]=dep[fa[s][0]]+1;
    F(i,0,30) fa[s][i+1]=fa[fa[s][i]][i];
    F(i,0,(int)mp[s].size()-1) {
        int to=mp[s][i];
        if(!dep[to]) {
            fa[to][0]=s;
            dfs(to);
        }
    }
}
int Lca(int x,int y) {
    if(dep[x]>dep[y]) swap(x,y);
    for(int i=30;i>=0;i--) if(dep[fa[y][i]]>=dep[x]) y=fa[y][i];
    if(x==y) return x;
    for(int i=30;i>=0;i--) if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
    return fa[x][0];
}
void dfs_sum(int s) {
    F(i,0,(int)mp[s].size()-1){
        int to=mp[s][i];
        if(to!=fa[s][0]) {
            dfs_sum(to);
            sum[s]+=sum[to];
        }
    }
}
int main(){
    scanf("%d",&n);
    F(i,1,n) scanf("%d",&a[i]);
    F(i,1,n-1) {
        scanf("%d%d",&u,&v);
        mp[u].p_b(v);
        mp[v].p_b(u);
    }
    dfs(1);
    F(i,1,n-1) {
        sum[a[i]]++,sum[a[i+1]]++;
        int x=Lca(a[i],a[i+1]);
        sum[x]--,sum[fa[x][0]]--;
    }
    dfs_sum(1);
    F(i,1,n) printf("%d\n",sum[i]-(i==1?0:1));
    return 0;
}
2020/8/22 12:58
加载中...