Submission #1260499

#TimeUsernameProblemLanguageResultExecution timeMemory
1260499abdelhakimSpring cleaning (CEOI20_cleaning)C++20
9 / 100
1097 ms20660 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;
}
vector<ll> value;
vector<ll> in;
vector<ll> out;
const int maxn=4e5+3;
int tree[maxn];
void update(ll node, ll l, ll r, ll pos, ll val)
{
  if(pos > r || pos < l)
  {
    return;
  }
  if(l==r)
  {
    tree[node]=val;
    return;
  }
  ll mid=(l+r)>>1;
  update(node*2+1,l,mid,pos,val);
  update(node*2+2,mid+1,r,pos,val);
  tree[node]=tree[node*2+1]+tree[node*2+2];
}
ll query(ll node, ll l, ll r, ll x, ll y)
{
  if(max(l,x) > min(r,y))
  {
    return 0;
  }
  if(l==r)
  {
    return tree[node];
  }
  ll mid=(l+r)>>1;
  return query(node*2+1,l,mid,x,y)+query(node*2+2,mid+1,r,x,y);
}
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 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);
  for (int i=0;i<maxn;i++) tree[i]=0;
  ll n, q;
  cin>>n>>q;
  vector<vector<ll>> adj(n);
  value.resize(n);
  in.resize(n);
  out.resize(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);
  ll time=0;
  dfs(0,0,0,adj,parr,time);
  dbg(old);
  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 (auto &&e : v)
      {
        update(0,0,n-1,in[e],1);
      }
      for (auto &&e : v)
      {
        ll vl=query(0,0,n-1,in[e],out[e])-1;
        if(vl%2)
        {
          ans-=value[e];
        }
        else
        {
          ans+=value[e];
        }
      }
      cout << ans << endl;
      for (auto &&e : v)
      {
        update(0,0,n-1,in[e],0);
      }
    }
  }
}
#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...