Submission #1182123

#TimeUsernameProblemLanguageResultExecution timeMemory
1182123ByeWorldSpring cleaning (CEOI20_cleaning)C++20
100 / 100
344 ms25668 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
// #define int long long
#define ll long long
#define pb push_back
#define fi first
#define se second
#define lf (id<<1)
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
#define ld long double
using namespace std;
typedef pair<int,int> pii;
typedef pair<int,pii> ipii;
const int MAXN = 1e5+10;
const int MAXA = 2e5;
const int INF = 2e9+100;
const int SQRT = 500;
const int LOG = 24;
const int MOD = 1e9;
void chmn(auto &a, auto b){ a = min(a, b); }
void chmx(int &a, int b){ a = max(a, b); }

int n, q, val[MAXN];
vector<int> adj[MAXN], tree[MAXN];
int root[MAXN], dep[MAXN], sub[MAXN], par[MAXN], sta;

void bd(int nw, int pa){
	par[nw] = pa;
	dep[nw] = dep[pa]+1; sub[nw] = 1;
	for(auto nx : adj[nw]){
		if(nx==pa) continue;
		bd(nx,nw);
		tree[nw].pb(nx);
		sub[nw] += sub[nx]; 
	}
}

int tim, in[MAXN];
void ch(int nw, int ROOT){
	in[nw] = ++tim;
	root[nw] = ROOT;
	if(tree[nw].size()==0) return;

	ch(tree[nw][0], ROOT);
	for(int i=1; i<tree[nw].size(); i++)
		ch(tree[nw][i], tree[nw][i]);
}
struct seg {
	int one[4*MAXN], zer[4*MAXN], laz[4*MAXN];
	void mrg(int id){
		one[id] = one[lf]+one[rg]; zer[id] = zer[lf]+zer[rg];
	}
	void bd(int id, int l, int r){
		if(l==r){
			zer[id] = 1; one[id] = 0; return;
		}
		bd(lf,l,md); bd(rg,md+1,r);
		mrg(id);
	}
	void bnc(int id, int l, int r){
		laz[id] %= 2;
		if(laz[id]==0) return;
		swap(one[lf], zer[lf]); laz[lf] += laz[id];
		swap(one[rg], zer[rg]); laz[rg] += laz[id];
		laz[id] = 0;
	}
	pii que(int id,int l,int r,int x,int y){
		if(x<=l && r<=y) return {one[id], zer[id]};
		if(r<x || y<l) return {0, 0};
		bnc(id,l,r);
		pii le = que(lf,l,md,x,y), ri = que(rg,md+1,r,x,y);
		return {le.fi+ri.fi, le.se+ri.se};
	}
	void upd(int id,int l,int r,int x,int y,int p){
		if(x<=l && r<=y){
			laz[id] += p;
			if(p==1 || p==-1){
				swap(one[id], zer[id]);
			}
			return; 
		}
		if(r<x || y<l) return;
		bnc(id,l,r);
		upd(lf,l,md,x,y,p); upd(rg,md+1,r,x,y,p);
		mrg(id);
	}
} A;
int lg = 0;
void UP(int nw, int val){
	lg++;
	if(lg >= 20) assert(false);
	if(root[nw]==sta){
		int roo = root[nw];
		A.upd(1,1,n,in[roo],in[nw], val);
		return;
	}
	int roo = root[nw];
	A.upd(1,1,n,in[roo],in[nw], val);
	nw = par[roo];
	UP(nw, val);
}

void UPD(int nw, int val){
	lg = 0;
	UP(nw, val);
}
bool isleaf[MAXN];
signed main(){
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>q;
	for(int i=1; i<=n-1; i++){
		int u, v; cin>>u>>v;
		adj[u].pb(v); adj[v].pb(u);
	}
	for(int i=1; i<=n; i++)
		if(adj[i].size() != 1) sta = i;
	bd(sta,0);
	for(int i=1; i<=n; i++){
		if(tree[i].size()==0) continue;
		for(int j=1; j<tree[i].size(); j++)
			if(sub[tree[i][0]] < sub[tree[i][j]])
				swap(tree[i][0], tree[i][j]);
	}
	ch(sta,sta);

	A.bd(1,1,n);
	for(int i=1; i<=n; i++){
		if(tree[i].size() == 0){
			isleaf[i] = 1;
			// cout << i << " updi\n";
			UPD(i, 1);
		}
	}
	// for(int i=1; i<=n; i++){
	// 	pii ret = A.que(1,1,n,in[i],in[i]);
	// 	// cout << ret.fi << ' ' << ret.se << " reet\n";
	// }

	while(q--){
		int num; cin>>num; vector<int>add;
		vector <int> bacleaf;
		for(int i=1; i<=num; i++){
			int x; cin>>x; add.pb(x);
			if(isleaf[x]){ // pop
				UPD(x, 1);
				isleaf[x] = 0; bacleaf.pb(x);
			}
			UPD(x, 1);
		}
		if(A.que(1,1,n,in[sta],in[sta]).fi) cout << "-1\n";
		else {
			int ans = num;
			pii ret = A.que(1,1,n,1,n);
			// cout << ret.fi << ' ' << ret.se << " ret\n";
			ans += ret.fi + 2*ret.se;
			cout << ans-2 << '\n';
		}

		for(int i=0; i<add.size(); i++){
			UPD(add[i], 1);
		}
		for(auto in : bacleaf){
			isleaf[in] = 1;
			UPD(in, 1);
		}
	}
}
#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...