代码:
#include<bits/stdc++.h>
#define ll long long
#define db double
#define ull unsigned ll
#define ldb long db
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pdd pair<db,db>
#define F first
#define S second
#define pb push_back
using namespace std;
const int N=1e5+5;
int n,u,v,c,m,rt[N],siz,lson[N*25],rson[N*25],tr[N*25],ans[N];
vector<int> e[N];
void pushup(int x){
tr[x]=tr[lson[x]]+tr[rson[x]];
}
void updt(int &x,int l,int r,int p){
if(!x) x=++siz;
if(l==r){
tr[x]=1;
return;
}
int mid=(l+r)>>1;
if(p<=mid) updt(lson[x],l,mid,p);
else updt(rson[x],mid+1,r,p);
pushup(x);
}
int merge(int x,int y,int l,int r){
if(!x || !y) return x+y;
if(l==r){
tr[x]=1;
return x;
}
int mid=(l+r)>>1;
lson[x]=merge(lson[x],lson[y],l,mid);
rson[x]=merge(rson[x],rson[y],mid+1,r);
pushup(x);
return x;
}
void getans(int cur,int fa){
for(int to:e[cur]) if(to!=fa){
getans(to,cur);
rt[cur]=merge(rt[cur],rt[to],1,N);
}
ans[cur]=tr[rt[cur]];
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;++i){
scanf("%d%d",&u,&v);
e[u].pb(v);
e[v].pb(u);
}
for(int i=1;i<=n;++i){
scanf("%d",&c);
updt(rt[i],1,N,c);
}
getans(1,0);
scanf("%d",&m);
while(m--){
scanf("%d",&u);
printf("%d\n",ans[u]);
}
return 0;
}
但是这题暴力是能过的……