제출 #1123820

#제출 시각아이디문제언어결과실행 시간메모리
1123820Haikm13579Spring cleaning (CEOI20_cleaning)C++17
16 / 100
263 ms16196 KiB
#include<bits/stdc++.h>
#define ll long long
#define ldb long double
#define fi first
#define se second
#define pir pair<int,int>
using namespace std;
const int maxn = 2e5 + 5;

template <class t1,class t2> inline void maxi(t1 &x,t2 y){if (x < y) x = y;}
template <class t1,class t2> inline void mini(t1 &x,t2 y){if (x > y) x = y;}

vector <int> Q[maxn],vec[maxn];

void input(int n,int q){
	for (int i = 1 ; i < n ; i++){
		int u,v;
		cin >> u >> v;
		vec[u].push_back(v);
		vec[v].push_back(u);
	}
	
	for (int id = 1 ; id <= q ; id++){
		int len;
		cin >> len;
		Q[id].resize(len);
		
		for (int i = 0 ; i < len ; i++) cin >> Q[id][i];
	}
}

namespace subtask3{
	bool subtask3(int n,int q){
		return (n <= 20000 && q <= 300);
	}
	
	int XOR[maxn];
	
	int get_root(int n){
		for (int i = 1 ; i <= n ; i++)
		    if (vec[i].size() > 1) return i;
		
		return 1;
	}
	bool get_parity(int n){
		bool c = 0;
		for (int i = 1 ; i <= n ; i++)
		    c ^= (vec[i].size() == 1);
		return c;
	}
	
	int dfs(int u,int par){
		XOR[u] = 0;
		
		if (vec[u].size() <= 1){
			XOR[u] = 1;
			return 1;
		}
		
		int res = 0;
		for (int v : vec[u])
		    if (v != par){
		    	res += dfs(v,u);
		    	XOR[u] ^= XOR[v];
			}
		
		if (XOR[u]) res++;
		if (!XOR[u] && par > 0) res += 2;
		return res;
	}
	
	int get_answer(int root,int parity,int id,int n){
		int N = n;
		for (int u : Q[id])
		   vec[u].push_back(++N);
		
	    int res = dfs(root,0);
	    
		for (int u : Q[id])
		    while (vec[u].back() > n) vec[u].pop_back();
	    
	    if (XOR[root]) return -1;
		
		return res;
	}
	
	void solve(int n,int q){
		int root = get_root(n),parity = get_parity(n);
		
		for (int id = 1 ; id <= q ; id++)
		   cout << get_answer(root,parity,id,n) << "\n";
	}
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	int n,q;
	cin >> n >> q;
	input(n,q);
	
	if (subtask3::subtask3(n,q)){
		subtask3::solve(n,q);
		return 0;
	}

	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...