Submission #1160337

#TimeUsernameProblemLanguageResultExecution timeMemory
1160337Kaztaev_AlisherSpring cleaning (CEOI20_cleaning)C++20
100 / 100
158 ms22856 KiB

#include <bits/stdc++.h>
 
#define ios ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define file(s) if (fopen(s".in", "r")) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout)
#define all(a) a.begin() , a.end()
#define F first
#define S second
 
using namespace std;
using ll = long long;
 
const int N = 2e5+5 , inf = 2e9 + 7;
const ll INF = 1e18 ,   mod = 1e9+7;	

int P[N] , D[N] , H[N] , B[N] , pos[N] , NW;
int n , q , t[N*4] , a[N], b[N] , u[N*4] , sub[N] , cnt[N];
vector<int> g[N];  
void upd(int v, int tl , int tr , int pos , int val){
	if(tl == tr){
		t[v] = val;
		return;
	}
	int tm = (tl+tr) >> 1;
	if(tm >= pos) upd(v*2,tl,tm,pos,val);
	else upd(v*2+1,tm+1,tr,pos,val);
	t[v] = t[v*2]+t[v*2+1];
}
void push(int v, int tl ,int tr){
	if(tl == tr || u[v] == 0) return;
	int tm = (tl+tr) >> 1;
	t[v*2] = tm-tl+1-t[v*2];
	t[v*2+1] = tr-tm-t[v*2+1];
	u[v*2+1] ^= u[v];
	u[v*2] ^= u[v];
	u[v] = 0;
}
void updlr(int v, int tl , int tr , int l , int r){
	push(v,tl,tr);
	if(l <= tl && tr <= r){
		t[v] = tr-tl+1-t[v];
		u[v] = 1;
		return;;
	}
	if(tl > r || tr < l) return;
	int tm = (tl+tr) >> 1;
	updlr(v*2,tl,tm,l,r);
	updlr(v*2+1,tm+1,tr,l,r);
	t[v] = t[v*2]+t[v*2+1];
}
int dfs(int v , int pr){
	P[v] = pr;
	D[v] = D[pr]+1;
	int sz = 1;
	int mx = 0;
	sub[v] = 0;
	for(int to : g[v]){
		if(to != pr){
			int tosz = dfs(to,v);
			sz += tosz;
			sub[v] += sub[to];
			if(tosz > mx){
				mx = tosz;
				H[v] = to;
			}
		}
	}
	if(g[v].size() == 1) sub[v] = 1;
	return sz;
}
void decompose(int v, int h){
	B[v] = h;
	pos[v] = ++NW;
	// cout << sub[v] << " "  << v << "\n";
	upd(1,1,n,NW,1-sub[v]%2);
	if(H[v]) decompose(H[v],h);
	for(int to : g[v]){
		if(to != P[v] && to != H[v]) decompose(to,to);
	}
}
void update(int a , int b){
	for(;; b = P[B[b]]){
		// cout << B[b] <<" " << b << "\n";
		updlr(1,1,n,pos[B[b]],pos[b]);
		if(b == a) break;
		if(B[b] == a) break;
	}
}
void solve(){
	cin >> n >> q;
	NW = 0;
	for(int i = 1; i < n; i++){
		cin >> a[i] >> b[i];
		g[a[i]].push_back(b[i]);
		g[b[i]].push_back(a[i]);
	}
	int kol = 0;
	int st = 1;
	for(int i = 1; i <= n; i++){
		if(g[i].size() != 1){
			st = i;
			break;
		}
	}
	for(int i = 1; i <= n; i++){
		if(g[i].size() == 1) kol++;
	}
	dfs(st,st);
	decompose(st,st);
	while(q--){
		int k;
		cin >> k;
		set<int> stt;
		for(int i = 1; i <= k; i++){
			int a;
			cin >> a;
			cnt[a]++;
			stt.insert(a);
		}
		for(auto x : stt){
			int nw = (cnt[x]-(g[x].size() == 1));
			kol += nw;
			if(nw%2) update(st,x);
		}
		if(kol % 2 == 1) cout << "-1\n";
		else cout << t[1]+n+k-2 << "\n"; 
		for(auto x : stt){ 
			int nw = (cnt[x]-(g[x].size() == 1));
			kol -= nw;
			if(nw%2) update(st,x);
			cnt[x] = 0;
		}
	}	
}
/*

*/
signed main(){
	ios;
	solve();
	return 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...