居然内存超限,绝了 本来还觉得能用tarjan直接秒了的
#include <bits/stdc++.h>
#define lowbit(x) x&-x
using namespace std;
const int maxv=12000;
const int maxNum=0x7fffffff;
const double PI=3.1415927;
const double eps=1e-6;
const int mod=1e9+7;
typedef long long LL;
vector<int> g[maxv];
int father[maxv],v[maxv];
vector<int> query[maxv],ans;
int n,r,m,a,b,tot,t=1,num;
LL cnt[maxv];
int getFa(int x){
if(x==father[x]) return x;
return father[x]=getFa(father[x]);
}
void addQuery(int x,int y,int id){
query[x].push_back(y);
query[y].push_back(x);
}
void tarjan(int x){
v[x]=1;
for(int i=0;i<g[x].size();i++){
int y=g[x][i];
if(v[y]) continue;
tarjan(y),father[y]=x;
}
for(int i=0;i<query[x].size();i++){
int y=query[x][i];
if(v[y]==2){
int lca=getFa(y);
ans.push_back(lca);
}
}
v[x]=2;
}
int main()
{
scanf("%d %d %d",&n,&r,&m);
for(int i=0;i<maxv;i++) father[i]=i;
for(int i=1;i<=n-1;i++) scanf("%d %d",&a,&b),g[a].push_back(b),g[b].push_back(a);
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
addQuery(i,j,t++),addQuery(j,i,t++);
tarjan(r);
for(int i=0;i<ans.size();i++) cnt[ans[i]]++,cnt[ans[i]]%=mod;
for(int i=1;i<=m;i++) scanf("%d",&num),printf("%lld\n",(cnt[num]+1)%mod);
return 0;
}