#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)
int n,q;
vector<int>komsu[100023];
int dep[100023],sub[100023],cnt[100023],ust[100023],par[100023];
int leaf[100023];
int in[100023],out[100023];
int sira[100023];
int tim=0;
int pref[100023];
int ans=0;
int root=0;
vector<int>child[100023];
int val[100023];
map<int,int>mp;
void predfs(int pos){
sub[pos]=1;
cnt[pos]=0;
for(int x:komsu[pos]){
if(x==par[pos])continue;
dep[x]=dep[pos]+1;
par[x]=pos;
predfs(x);
cnt[pos]+=cnt[x];
sub[pos]+=sub[x];
}
if(!cnt[pos]){
leaf[pos]=1;
cnt[pos]=1;
}
}
void dfs(int pos){
int mx=-1;
in[pos]=++tim;
sira[in[pos]]=pos;
pref[in[pos]]=pref[in[pos]-1];
if(par[pos])pref[in[pos]]+=(cnt[pos]&1)*2-1;
if(par[pos])ans+=!(cnt[pos]&1);
for(int x:komsu[pos]){
if(x==par[pos])continue;
if(mx==-1||sub[x]>sub[mx])mx=x;
}
if(mx!=-1){
ust[mx]=ust[pos];
dfs(mx);
for(int x:komsu[pos]){
if(x==par[pos]||x==mx)continue;
ust[x]=x;
dfs(x);
}
}
out[pos]=tim;
}
int cal(int from,int tar){
int res=0;
while(dep[ust[from]]>dep[tar]){
res+=pref[in[from]]-pref[in[ust[from]]-1];
from=par[ust[from]];
}
res+=pref[in[from]]-pref[in[tar]];
return res;
}
int gez(int pos){
int res=0;
for(int x:child[pos]){
res+=gez(x);
val[pos]+=val[x];
if(val[x]&1){
res+=cal(x,pos);
}
}
child[pos].clear();
return res;
}
int lca(int a,int b){
bool c=false;
if(a==26&&b==30)c=true;
while(ust[a]!=ust[b]){
while(ust[a]!=ust[b]&&dep[ust[a]]<=dep[ust[b]])b=par[ust[b]];
swap(a,b);
}
if(dep[a]<dep[b])swap(a,b);
if(in[b]<=in[a]&&out[b]>=in[a])return b;
return par[ust[b]];
}
int main(){
ios_base::sync_with_stdio(23^23);cin.tie(NULL);
cin>>n>>q;
for(int i=1;i<n;i++){
int x,y;cin>>x>>y;
komsu[x].pb(y);
komsu[y].pb(x);
}
root=1;
while(komsu[root].size()==1)root++;
dep[root]=1;
ust[root]=root;
predfs(root);
dfs(root);
while(q--){
int m;
mp.clear();
cin>>m;
for(int i=0;i<m;i++){
int x;cin>>x;
mp[in[x]]++;
}
vector<int>v;
for(auto&[a,b]:mp){
v.pb(sira[a]);
b-=leaf[sira[a]];
}
int s=v.size();
for(int i=1;i<s;i++){
int lc=lca(v[i-1],v[i]);
if(mp.count(in[lc])==0){
mp[in[lc]]=0;
v.pb(lc);
}
}
sort(v.begin(),v.end(),[&](const int &x,const int &y){
return in[x]<in[y];
});
for(auto[a,b]:mp){
val[sira[a]]=b;
}
vector<int>sta={v[0]};
s=v.size();
for(int i=1;i<s;i++){
while(in[v[i]]>out[sta.back()])sta.pop_back();
child[sta.back()].pb(v[i]);
sta.pb(v[i]);
}
int res=gez(v[0]);
if((val[v[0]]+cnt[root])&1){
cout<<-1<<endl;
continue;
}
if(val[v[0]]&1)res+=cal(v[0],root);
cout<<ans+res+n-1+m<<endl;
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |