神秘的 O(∑k2logk) 算法切掉了 80 分
#include <bits/stdc++.h>
using namespace std;
const int N=1e6;
int n,m;
struct Graph{
int cnt,a,b;
int head[N+5],to[(N<<1)+5],v[(N<<1)+5];
void clear(){
cnt=1;
return ;
}
void add(int x,int y){
v[cnt]=y;
to[cnt]=head[x];
head[x]=cnt++;
return ;
}
void add_edge(){
scanf("%d%d",&a,&b);
add(a,b),add(b,a);
}
}RG;
struct Lca{
int dep[N+5],siz[N+5],faz[N+5],son[N+5],top[N+5];
void dfs1(int u){
siz[u]=1;
son[u]=0;
for(int i=RG.head[u];i;i=RG.to[i]){
int v=RG.v[i];
if(v==faz[u])continue;
faz[v]=u;
dep[v]=dep[u]+1;
dfs1(v);
siz[u]+=siz[v];
if(siz[v]>siz[son[u]])son[u]=v;
}
return ;
}
void dfs2(int u,int rt){
top[u]=rt;
if(son[u])dfs2(son[u],rt);
for(int i=RG.head[u];i;i=RG.to[i]){
int v=RG.v[i];
if(v==faz[u]||v==son[u])continue;
dfs2(v,v);
}
return ;
}
void pre(){
dfs1(1);
dfs2(1,1);
return ;
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
x=faz[top[x]];
}
if(dep[x]<dep[y])swap(x,y);
return y;
}
int dis(int x,int y){
return dep[x]+dep[y]-2*dep[lca(x,y)];
}
}Lca;
struct Solve{
int k;
int lst[N+5];
long long sum,Min,Max;
long long min(long long a,long long b){
return a<b?a:b;
}
long long max(long long a,long long b){
return a>b?a:b;
}
void query(){
sum=Max=0;
Min=2e9;
scanf("%d",&k);
for(int i=1;i<=k;i++)scanf("%d",&lst[i]);
for(int i=1;i<=k;i++){
for(int j=i+1;j<=k;j++){
int D=Lca.dis(lst[i],lst[j]);
sum+=D;
Min=min(Min,D);
Max=max(Max,D);
}
}
printf("%lld %lld %lld\n",sum,Min,Max);
}
}Q;
int main(){
RG.clear();
scanf("%d",&n);
for(int i=1;i<n;i++)RG.add_edge();
Lca.pre();
scanf("%d",&m);
for(int i=1;i<=m;i++)Q.query();
}