#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
vector<int> G[N<<1],g[N<<1];
int vis1[N],ans[N],F[N],fa[N][22],lst[N],dp[N],vis[N],dep[N],dfn[N],now,siz[N];
void dfs(int u,int fath){
dep[u]=dep[fath]+1,dfn[u]=++now,siz[u]=1;
fa[u][0]=fath;
for(int i=1;i<=22;i++) fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(v==fath) continue;
dfs(v,u);
siz[u]+=siz[v];
}
}
bool cmp(int x,int y){
return dfn[x]<dfn[y];
}
int cal(int x,int y){
int p=y,q=y;
for(int i=log2(dep[p]);i>=0;i--) if(dep[fa[p][i]]>dep[x]) p=fa[p][i];
ans[F[x]]-=siz[p];
for(int i=log2(dep[q]);i>=0;i--){
int now=dep[y]-dep[fa[q][i]]+dp[y],now1=dep[fa[q][i]]-dep[x]+dp[x];
if(dep[fa[q][i]]>dep[x]&&(now<now1||(now==now1&&F[y]<F[x]))) q=fa[q][i];
}
ans[F[y]]+=siz[q]-siz[y],ans[F[x]]+=siz[p]-siz[q];
}
void dfs1(int u,int fa){
dp[u]=INT_MAX;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==fa) continue;
dfs1(v,u);
int dis=dep[v]-dep[u];
if(dp[v]+dis<dp[u]) dp[u]=dp[v]+dis,F[u]=F[v];
else if(dp[u]+dis==dp[v]) F[u]=min(F[u],F[v]);
}
if(vis[u]) dp[u]=0,F[u]=u;
}
void dfs2(int u,int fa){
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==fa) continue;
int dis=dep[v]-dep[u];
if(dp[v]+dis<dp[u]) dp[u]=dp[v]+dis,F[u]=F[v];
else if(dp[u]+dis==dp[v]) F[u]=min(F[u],F[v]);
cal(u,v);
dfs2(u,v);
}
ans[F[u]]+=siz[u];
vis[u]=0;
}
void Add(int u,int v){
G[u].push_back(v);
}
int LCA(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
int d=dep[x]-dep[y];
for(int i=22;i>=0;i--) if((1<<i)&d) x=fa[x][i];
if(x==y) return x;
for(int i=22;i>=0;i--) if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
int main()
{
int n;
cin>>n;
for(int i=1,u,v;i<n;i++) cin>>u>>v,g[u].push_back(v),g[v].push_back(u);
dfs(1,0);
int t;
cin>>t;
while(t--){
int m;
cin>>m;
bool f=true;
for(int i=1;i<=m;i++) cin>>lst[i],vis[lst[i]]=1;
if(!vis[1]) lst[++m]=1,f=0;
sort(lst+1,lst+m+1,cmp);
stack<int> s;
s.push(1);
for(int i=1;i<=m;i++){
int u=lst[i],lca=LCA(u,s.top());
while(lca!=s.top()){
int now=s.top();s.pop();
if(dfn[s.top()]<dfn[lca]) s.push(lca);
Add(now,s.top());
}
}
while(s.top()!=1){
int now=s.top();s.pop();
Add(now,s.top());
}
for(int i=1;i<=m;i++) vis1[i]=lst[i];
dfs1(1,0),dfs2(1,0);
for(int i=1;i<=m;i++) if(vis1[i]!=1||f) cout<<ans[lst[i]]<<" ";
cout<<endl;
}
return 0;
}
已经爆炸了。
求调/kel