RT.
TLE on # 10 ,到底是做法假了还是要卡常
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int Next,to,w;
}e[500010],d[500010];
int head[250010],cnt,g[250010],head2[250010],cnt2,dep[250010],dfn[250010],l[250010][22],a[250010],b[250010],minn[250010][22],dp[250010],you[250010];
bool is[250010];
void add(int x,int y,int z){
e[++cnt]=(node){head[x],y,z};
head[x]=cnt;
}
void add2(int x,int y,int z){
d[++cnt2]=(node){head2[x],y,z};
head2[x]=cnt2;
}
int tot;
void dfs(int x,int fa){
dfn[x]=++tot;
dep[x]=dep[fa]+1;
l[x][0]=fa;
for(int i=1;i<=20;i++){
l[x][i]=l[l[x][i-1]][i-1];
minn[x][i]=min(minn[x][i-1],minn[l[x][i-1]][i-1]);
}
for(int i=head[x];i;i=e[i].Next){
int y=e[i].to;
if(y==fa)continue;
minn[y][0]=e[i].w;
dfs(y,x);
}
}
int k,bl,o;
bool cmp(int x,int y){
return dfn[x]<dfn[y];
}
int lca(int x,int y){
if(dep[x]<dep[y]){
swap(x,y);
}
for(int i=20;i>=0;i--){
if(dep[l[x][i]]>=dep[y]){
bl=min(bl,minn[x][i]);
x=l[x][i];
}
}
if(x==y){
return x;
}
for(int i=20;i>=0;i--){
if(l[x][i]!=l[y][i]){
bl=min(bl,min(minn[x][i],minn[y][i]));
x=l[x][i],y=l[y][i];
}
}
return l[x][0];
}
void build(){
sort(g+1,g+k+1,cmp);
int num=0,p=0;
for(int i=1;i<k;i++){
a[++num]=g[i];
a[++num]=lca(g[i],g[i+1]);
}
a[++num]=g[k];
a[++num]=1;
sort(a+1,a+num+1,cmp);
for(int i=1;i<=num;i++){
if(a[i]!=a[i+1]){
b[++p]=a[i];
}
}
for(int i=1;i<p;i++){
int lc=lca(b[i],b[i+1]);
bl=LONG_LONG_MAX;
int feiwu=lca(lc,b[i+1]);
add2(lc,b[i+1],bl);
you[++o]=lc;
you[++o]=b[i+1];
}
}
void dfs2(int x,int fa){
for(int i=head2[x];i;i=d[i].Next){
int y=d[i].to;
if(y==fa)continue;
dfs2(y,x);
if(is[y]){
dp[x]+=d[i].w;
}
else{
dp[x]+=min(dp[y],d[i].w);
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(),cout.tie();
int n;
cin>>n;
for(int i=1;i<n;i++){
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
for(int i=1;i<=n;i++){
for(int j=0;j<=20;j++){
minn[i][j]=LONG_LONG_MAX;
}
}
dfs(1,0);
int m;
cin>>m;
while(m--){
cin>>k;
for(int i=1;i<=k;i++){
cin>>g[i];
is[g[i]]=1;
}
build();
dfs2(1,0);
cout<<dp[1]<<endl;
for(int i=1;i<=k;i++){
is[g[i]]=0;
}
for(int i=1;i<=o;i++){
dp[you[i]]=0,head2[you[i]]=0;
}
cnt2=0,o=0;
}
return 0;
}