Submission #1262173

#TimeUsernameProblemLanguageResultExecution timeMemory
1262173abdelhakimSpring cleaning (CEOI20_cleaning)C++20
28 / 100
1094 ms16760 KiB
// #include <bits/stdc++.h>
// #define ll long long
// #define dbg(x) cerr << #x << ' ' <<  x << endl; 
// #define inf 1e18
// using namespace std;

// void printvec(vector<ll>& vec)
// {
//   for (auto &&e : vec)
//   {
//     cout << e << ' ';
//   }
//   cout << endl;
// }
// const int maxn = 1e5;
// int value[maxn];
// int in[maxn];
// int out[maxn];
// int arr2[maxn];
// const int lg=18;
// int up[maxn][lg];

// ll solve(vector<vector<ll>>& adj, ll node, ll par, ll& ans,vector<pair<ll,ll>>& parr)
// {
//   if(node!=par && adj[node].size()==1)
//   {
//     parr[node]={par,1};
//     if(node!=0)
//     {
//       if(parr[node].second==0) ans+=2;
//       else ans++;
//     }
//     return 1;
//   }
//   ll sm=0;
//   for (auto &&e : adj[node])
//   {
//     if(e==par)continue;
//     ll val=solve(adj,e,node,ans,parr);
//     sm+=val;
//   }
//   if(adj[node].size()==1 && node==0) sm++;
//   parr[node]={par,sm%2};
//   if(node!=0)
//   {
//     if(parr[node].second==0) ans+=2;
//     else ans++;
//   }
//   return sm;
// }
// void dfs(ll node, ll par, ll cur,vector<vector<ll>>& adj, vector<pair<ll,ll>>& parr, ll& time)
// {
//   in[node]=time;
//   if(node!=0)
//   {
//     if(parr[node].second)
//     {
//       cur++;
//     }
//     else cur--;
//   }
//   value[node]=cur;
//   for (auto &&e : adj[node])
//   {
//     if(e==par) continue;
//     time++;
//     dfs(e,node,cur,adj,parr,time); 
//   }
//   out[node] = time;
// }
// void gadup(ll n, vector<pair<ll,ll>>& parr)
// {
//   for (int i=0;i<n;i++)
//   {
//     for (int j=0;j<lg;j++)
//     {
//       if(j==0)
//       {
//         up[i][j]=parr[i].first;
//       }
//       else
//       {
//         up[i][j]=up[up[i][j-1]][j-1];
//       }
//     }
//   }
// }
// bool islca(ll a, ll b)
// {
//   if(in[a] <= in[b] && in[b] <= out[a]) return true;
//   return false;
// }
// ll lca(ll u, ll v)
// {
//   if(islca(u,v)) return u;
//   if(islca(v,u)) return v;
//   for (int j=lg-1;j>=0;j--)
//   {
//     if(!(islca(up[u][j],v)))
//     {
//       u=up[u][j];
//     }
//   }
//   u=up[u][0];
//   return u;
// }
// ll dfs2(ll& ans, ll node, ll par, vector<vector<ll>>& adj)
// {
//   if(node!=0 && adj[node].size()==1) return arr2[node];
//   ll val=arr2[node];
//   for (auto &&e : adj[node])
//   {
//     if(e==par) continue;
//     ll qry=dfs2(ans,e,node,adj);
//     val+=qry;
//     if(qry%2)
//     {
//       ans+=value[e]-value[node];
//     }
//   }
//   return val;
// }
// int main()
// {
//   cin.tie(0);
//   ios_base::sync_with_stdio(false);
//   ll n, q;
//   cin>>n>>q;
//   for (int i=0;i<maxn;i++)
//   {
//     arr2[i]=0;
//   }
//   vector<vector<ll>> adj(n);
//   value[0]=0;
//   for (int i=0;i<n-1;i++)
//   {
//     ll u, v;
//     cin>>u>>v;
//     u--;v--;
//     adj[u].push_back(v);
//     adj[v].push_back(u);
//   }
//   ll old=0;
//   ll leaves=0;
//   for (int i=0;i<n;i++)
//   {
//     leaves+=adj[i].size()==1;
//   }
//   vector<pair<ll,ll>> parr(n);
//   solve(adj,0,0,old,parr);
//   ll time=0;
//   dfs(0,0,0,adj,parr,time);
//   gadup(n,parr);
//   vector<vector<ll>> adj2(n);
//   while(q--)
//   {
//     ll d;
//     cin>>d;
//     vector<ll> v;
//     vector<ll> arr;
//     ll ans=old;
//     ll val=leaves;
//     for (int i=0;i<d;i++)
//     {
//       ll nd;
//       cin>>nd;
//       nd--;
//       arr.push_back(nd);
//     }
//     auto comp=[&](ll a, ll b){return in[a]<in[b];};
//     sort(arr.begin(), arr.end(),comp);
//     ll cur=0;
//     for (int i=0;i<d;i++)
//     {
//       cur++;
//       if(i==d-1 || arr[i+1]!=arr[i])
//       {
//         if(adj[arr[i]].size()==1)
//         {
//           cur--;
//         }
//         if(cur%2) v.push_back(arr[i]);
//         cur=0;
//       }
//     }
//     val+=v.size();
//     if(val%2) cout<<-1<<endl;
//     else
//     {
//       ans+=d;
//       vector<ll> v2;
//       for (auto &&e : v)
//       {
//         arr2[e]=1;
//         v2.push_back(e);
//       }
      
//       ll sz=v.size();
//       for (int i=0;i<sz-1;i++)
//       {
//         v.push_back(lca(v[i],v[i+1]));
//       }
//       v.push_back(0);
//       sort(v.begin(), v.end(),comp);
//       v.erase(unique(v.begin(),v.end()),v.end());
//       for (int i=0;i<v.size()-1;i++)
//       {
//         ll l=lca(v[i],v[i+1]);
//         adj2[v[i+1]].push_back(l);
//         adj2[l].push_back(v[i+1]);
//       }
//       dfs2(ans,0,0,adj2);
//       cout << ans << endl;
//       for (auto &&e : v)
//       {
//         adj2[e].clear();
//       }
//       for (auto &&e : v2)
//       {
//         arr2[e]=0;
//       }
      
//     }
//   }
// }

#include <bits/stdc++.h>
#define ll long long
#define dbg(x) cerr << #x << ' ' <<  x << endl; 
#define inf 1e18
using namespace std;

void printvec(vector<ll>& vec)
{
  for (auto &&e : vec)
  {
    cout << e << ' ';
  }
  cout << endl;
}
ll solve(vector<vector<ll>>& adj, ll node, ll par, ll& ans,vector<pair<ll,ll>>& parr)
{
  if(node!=par && adj[node].size()==1)
  {
    parr[node]={par,1};
    if(node!=0)
    {
      if(parr[node].second==0) ans+=2;
      else ans++;
    }
    return 1;
  }
  ll sm=0;
  for (auto &&e : adj[node])
  {
    if(e==par)continue;
    ll val=solve(adj,e,node,ans,parr);
    sm+=val;
  }
  if(adj[node].size()==1 && node==0) sm++;
  // if(node==0 && sm%2) ans=-1;
  parr[node]={par,sm%2};
  if(node!=0)
  {
    if(parr[node].second==0) ans+=2;
    else ans++;
  }
  return sm;
}
void tl3(ll node, vector<pair<ll,ll>>& parr, ll& ans)
{
  while(node!=0)
  {
    if(parr[node].second==0)ans--;
    else ans++;
    parr[node].second^=1;
    node=parr[node].first;
  }
}
int main()
{
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  ll n, q;
  cin>>n>>q;
  vector<vector<ll>> adj(n);
  for (int i=0;i<n-1;i++)
  {
    ll u, v;
    cin>>u>>v;
    u--;v--;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  ll old=0;
  ll leaves=0;
  for (int i=0;i<n;i++)
  {
    leaves+=adj[i].size()==1;
  }
  vector<pair<ll,ll>> parr(n);
  solve(adj,0,0,old,parr);
  while(q--)
  {
    ll d;
    cin>>d;
    vector<ll> v;
    vector<ll> arr;
    ll ans=old;
    ll val=leaves;
    for (int i=0;i<d;i++)
    {
      ll nd;
      cin>>nd;
      nd--;
      arr.push_back(nd);
    }
    sort(arr.begin(), arr.end());
    ll cur=0;
    for (int i=0;i<d;i++)
    {
      cur++;
      if(i==d-1 || arr[i+1]!=arr[i])
      {
        if(adj[arr[i]].size()==1)
        {
          cur--;
        }
        if(cur%2) v.push_back(arr[i]);
        cur=0;
      }
    }
    val+=v.size();
    if(val%2) cout<<-1<<endl;
    else
    {
      ans+=d;
      for (int i=0;i<v.size();i++)
    {
      ll nd=v[i];
      tl3(nd,parr,ans);
    }
    cout << ans << endl;
    for (auto &&e : v)
    {
      tl3(e,parr,ans);
    }
  }
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...