#include <bits/stdc++.h>
using namespace std;
template <class T>
struct RMQ { // 0-based
vector<vector<T>> rmq;
T kInf = numeric_limits<T>::max();
void build(const vector<T>& V) {
int n = V.size(), on = 1, dep = 1;
while (on < n) on *= 2, ++dep;
rmq.assign(dep, V);
for (int i = 0; i < dep - 1; ++i)
for (int j = 0; j < n; ++j) {
rmq[i + 1][j] = min(rmq[i][j], rmq[i][min(n - 1, j + (1 << i))]);
}
}
T query(int a, int b) { // [a, b)
if (b <= a) return kInf;
int dep = 31 - __builtin_clz(b - a); // log(b - a)
return min(rmq[dep][a], rmq[dep][b - (1 << dep)]);
}
};
struct LCA { // 0-based
int n, root;
vector<int> enter, depth, exxit;
vector<vector<int>> G;
vector<pair<int, int>> linear;
RMQ<pair<int, int>> rmq;
int timer = 0;
LCA() {}
LCA(vector<vector<int>> g, int root) {
n = g.size();
enter.resize(n, -1),
exxit.resize(n, -1);
depth.resize(n);
G=g;
linear.resize(2 * n);
build(root);
}
void dfs(int node, int dep) {
linear[timer] = {dep, node};
enter[node] = timer++;
depth[node] = dep;
for (auto vec : G[node])
if (enter[vec] == -1) {
dfs(vec, dep + 1);
linear[timer++] = {dep, node};
}
exxit[node] = timer;
}
void add_edge(int a, int b) {
G[a].push_back(b);
G[b].push_back(a);
}
void build(int root) {
dfs(root, 0);
rmq.build(linear);
}
int query(int a, int b) {
a = enter[a], b = enter[b];
return rmq.query(min(a, b), max(a, b) + 1).second;
}
int dist(int a, int b) {
return depth[a] + depth[b] - 2 * depth[query(a, b)];
}
};
int32_t main(){
ios_base::sync_with_stdio(false); cin.tie(0);
int n, q; cin >> n >> q;
vector<vector<int>> g(n);
vector<int> c(n);
vector<array<int, 2>> count(n);
int leafs=0, root=0;
for(int i =0; i<n-1; i++){
int x, y; cin >> x >> y;
x--; y--;
g[x].push_back(y);
g[y].push_back(x);
if(g[x].size()>1) root = x;
if(g[y].size()>1) root = y;
}
vector<int> vis(n), tin(n), tout(n);
LCA lca(g, root);
int cnt = 0;
auto dfs=[&](int v, int p, auto&& dfs)->void{
tin[v] = cnt++;
for(auto i: g[v])
if(i!=p) dfs(i, v, dfs), c[v]+=c[i];
if(g[v].size()==1) c[v]++, leafs++;
else vis[v] = 1;
tout[v] = cnt++;
};
int ans = 0;
auto dfs2=[&](int v, int p, auto&& dfs2)->void{
//cout<<v+1<<" "<<c[v]<<"\n";
if(c[v] %2) count[v][1]++;
else count[v][0]++, ans++;
for(auto i: g[v]){
if(i!=p){
count[i][0]+=count[v][0];
count[i][1]+=count[v][1];
dfs2(i, v, dfs2);
}
}
};
dfs(root, root, dfs);
dfs2(root, root, dfs2) ;
int tmpans = ans, tmpleafs=leafs;
while(q--){
int d; cin >> d;
vector<int> ar(d),a, up;
for(auto &i: ar) cin >> i, i--;
sort(ar.begin(), ar.end(), [&](int x, int y){
return tin[x] < tin[y];
});
int k=1;
for(int i=1; i<d; i++){
if(ar[i]==ar[i-1])k++;
else{
if(g[ar[i-1]].size()==1){
leafs+=k-1;
if(k%2==0) a.push_back(ar[i-1]);
k = 1;
}
else{
leafs+=k;
if(k%2==1) a.push_back(ar[i-1]);
k=1;
}
}
}
if(g[ar[d-1]].size()==1){
leafs+=k-1;
if(k%2==0) a.push_back(ar[d-1]);
}
else{
leafs+=k;
if(k%2==1) a.push_back(ar[d-1]);
}
up = a;
if(up.size()){
for(int i=0; i<a.size()-1; i++){
up.push_back(lca.query(a[i], a[i+1]));
}
sort(up.begin(), up.end(), [&](int x, int y){
return tin[x] < tin[y];
});
vector<int> upp;
for(int i=0; i<up.size(); i++){
if(i==0||up[i]!=up[i-1]) upp.push_back(up[i]);
}
up=upp;
upp.clear();
if(up.size()){
stack<int> st;
st.push(0);
vector<int> p(up.size()), v(up.size()), s(up.size());
vector<vector<int>> adj(up.size());
vector<int> aa(up.size());
sort(up.begin(), up.end(), [&](int x, int y){
return tin[x] < tin[y];
});
for(int i=1; i<up.size(); i++) {
while(st.size() && tout[up[st.top()]] < tin[up[i]]){
st.pop();
}
if(st.size())
adj[st.top()].push_back(i), aa[i]++, p[i]=st.top();
else p[i]=i;
st.push(i);
}
auto dfsa=[&](int ve, auto&&dfsa)->void{
for(auto i: adj[ve]){
dfsa(i, dfsa), v[ve]+=v[i];
}
};
int pos=0;
for(int l=0; l<a.size(); l++){
while(pos<up.size()&&up[pos]!=a[l]) pos++;
if(pos<up.size()&&up[pos]==a[l]) v[pos]++;
}
for(int i=0; i<up.size(); i++){
if(aa[i]==0) dfsa(i, dfsa);
}
for(int i=0; i<up.size(); i++){
if(p[i]==i){
auto x = count[up[i]];
if(v[i]%2){
ans-=x[0]; ans+=x[1];
}
}
else if(v[i]%2){
auto x=count[up[i]], y=count[up[p[i]]];
x[0]-=y[0];
x[1]-=y[1];
ans-=x[0]; ans+=x[1];
}
}
}
}
if((leafs%2)!=0) cout<<-1<<"\n";
else cout<<ans-1+d+n-1<<"\n";
ans=tmpans; leafs=tmpleafs;
}
}
Compilation message
cleaning.cpp: In function 'int32_t main()':
cleaning.cpp:165:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
165 | for(int i=0; i<a.size()-1; i++){
| ~^~~~~~~~~~~
cleaning.cpp:176:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
176 | for(int i=0; i<up.size(); i++){
| ~^~~~~~~~~~
cleaning.cpp:195:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
195 | for(int i=1; i<up.size(); i++) {
| ~^~~~~~~~~~
cleaning.cpp:212:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
212 | for(int l=0; l<a.size(); l++){
| ~^~~~~~~~~
cleaning.cpp:213:30: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
213 | while(pos<up.size()&&up[pos]!=a[l]) pos++;
| ~~~^~~~~~~~~~
cleaning.cpp:214:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
214 | if(pos<up.size()&&up[pos]==a[l]) v[pos]++;
| ~~~^~~~~~~~~~
cleaning.cpp:217:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
217 | for(int i=0; i<up.size(); i++){
| ~^~~~~~~~~~
cleaning.cpp:223:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
223 | for(int i=0; i<up.size(); i++){
| ~^~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
344 KB |
Output is correct |
2 |
Correct |
34 ms |
10200 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
11 ms |
1880 KB |
Output is correct |
2 |
Correct |
12 ms |
1884 KB |
Output is correct |
3 |
Correct |
61 ms |
52768 KB |
Output is correct |
4 |
Correct |
53 ms |
37076 KB |
Output is correct |
5 |
Correct |
68 ms |
52936 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
13 ms |
3164 KB |
Output is correct |
2 |
Correct |
13 ms |
3164 KB |
Output is correct |
3 |
Correct |
64 ms |
53736 KB |
Output is correct |
4 |
Correct |
82 ms |
49172 KB |
Output is correct |
5 |
Correct |
58 ms |
48976 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
30 ms |
10328 KB |
Output is correct |
2 |
Correct |
22 ms |
10328 KB |
Output is correct |
3 |
Correct |
14 ms |
10076 KB |
Output is correct |
4 |
Correct |
14 ms |
10332 KB |
Output is correct |
5 |
Correct |
14 ms |
10540 KB |
Output is correct |
6 |
Correct |
26 ms |
10332 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
67 ms |
32860 KB |
Output is correct |
2 |
Correct |
68 ms |
32848 KB |
Output is correct |
3 |
Correct |
47 ms |
16216 KB |
Output is correct |
4 |
Correct |
71 ms |
32988 KB |
Output is correct |
5 |
Correct |
68 ms |
32992 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
107 ms |
51684 KB |
Output is correct |
2 |
Correct |
127 ms |
53588 KB |
Output is correct |
3 |
Correct |
116 ms |
53344 KB |
Output is correct |
4 |
Correct |
126 ms |
52808 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
344 KB |
Output is correct |
2 |
Correct |
34 ms |
10200 KB |
Output is correct |
3 |
Correct |
11 ms |
1880 KB |
Output is correct |
4 |
Correct |
12 ms |
1884 KB |
Output is correct |
5 |
Correct |
61 ms |
52768 KB |
Output is correct |
6 |
Correct |
53 ms |
37076 KB |
Output is correct |
7 |
Correct |
68 ms |
52936 KB |
Output is correct |
8 |
Correct |
13 ms |
3164 KB |
Output is correct |
9 |
Correct |
13 ms |
3164 KB |
Output is correct |
10 |
Correct |
64 ms |
53736 KB |
Output is correct |
11 |
Correct |
82 ms |
49172 KB |
Output is correct |
12 |
Correct |
58 ms |
48976 KB |
Output is correct |
13 |
Correct |
30 ms |
10328 KB |
Output is correct |
14 |
Correct |
22 ms |
10328 KB |
Output is correct |
15 |
Correct |
14 ms |
10076 KB |
Output is correct |
16 |
Correct |
14 ms |
10332 KB |
Output is correct |
17 |
Correct |
14 ms |
10540 KB |
Output is correct |
18 |
Correct |
26 ms |
10332 KB |
Output is correct |
19 |
Correct |
67 ms |
32860 KB |
Output is correct |
20 |
Correct |
68 ms |
32848 KB |
Output is correct |
21 |
Correct |
47 ms |
16216 KB |
Output is correct |
22 |
Correct |
71 ms |
32988 KB |
Output is correct |
23 |
Correct |
68 ms |
32992 KB |
Output is correct |
24 |
Correct |
107 ms |
51684 KB |
Output is correct |
25 |
Correct |
127 ms |
53588 KB |
Output is correct |
26 |
Correct |
116 ms |
53344 KB |
Output is correct |
27 |
Correct |
126 ms |
52808 KB |
Output is correct |
28 |
Correct |
69 ms |
30384 KB |
Output is correct |
29 |
Correct |
90 ms |
53332 KB |
Output is correct |
30 |
Correct |
77 ms |
52684 KB |
Output is correct |
31 |
Correct |
86 ms |
48980 KB |
Output is correct |
32 |
Correct |
68 ms |
32852 KB |
Output is correct |
33 |
Correct |
90 ms |
42832 KB |
Output is correct |
34 |
Correct |
107 ms |
53108 KB |
Output is correct |
35 |
Correct |
110 ms |
53564 KB |
Output is correct |