P12698 [KOI 2022 Round 2] 树与查询 题解
题意
给定
题解
朴素做法是
复杂度
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+5;
int n,q,k,a[N],p[N];
bool v[N];
vector<int>e[N];
int ans;
void dfs(int x,int f)
{
p[x]=f;
for(auto y:e[x])
if(y!=f)
dfs(y,x);
}
int fa[N],siz[N];
int find(int x)
{return fa[x]=fa[x]==x?x:find(fa[x]);}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1,x,y;i<n;i++)
cin>>x>>y,
e[x].push_back(y),
e[y].push_back(x);
dfs(1,0);
cin>>q;
for(;q;q--)
{
cin>>k;ans=0;
for(int i=1;i<=k;i++)
cin>>a[i];
for(int i=1;i<=k;i++)
v[a[i]]=1,fa[a[i]]=a[i];
for(int i=1;i<=k;i++)
if(v[a[i]]&&v[p[a[i]]])
fa[a[i]]=find(p[a[i]]);
for(int i=1;i<=k;i++)
siz[find(a[i])]++;
for(int i=1;i<=k;i++)
ans+=siz[a[i]]*(siz[a[i]]-1)/2;
for(int i=1;i<=k;i++)
v[a[i]]=0,siz[a[i]]=0;
cout<<ans<<'\n';
}
return 0;
}