#include <bits/stdc++.h>
using namespace std;
// ordered set whith s.order_of_key(x) method, which returns rank of element x in set s
/*
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
*/
// pair printing
template <class T, class U>
ostream& operator<<(ostream& out, const pair<T, U> &par) {out << "(" << par.first << "; " << par.second << ")"; return out;}
// set printing
template <class T>
ostream& operator<<(ostream& out, const set<T> &cont) { out << "{"; for(const auto &x:cont) out << x << ", "; out << "}"; return out; }
// map printing
template <class T, class U>
ostream& operator<<(ostream& out, const map<T, U> &cont) {out << "{"; for(const auto &x:cont) out << x << ", "; out << "}"; return out; }
// unordered_set printing
template <class T>
ostream& operator<<(ostream& out, const unordered_set<T> &cont) {out << "{";for(const auto &x:cont) out << x << ", ";out << "}";return out;}
// unordered_map printing
template <class T, class U>
ostream& operator<<(ostream& out, const unordered_map<T, U> &cont) {out << "{";for(const auto &x:cont) out << x << ", ";out << "}";return out;}
// vector printing
template<class T>
ostream& operator<<(ostream& out, const vector<T> &cont){ out << "["; for (const auto &x:cont) out << x << ", "; out << "]"; return out;}
#define print(x) cout << (x) << endl;
#define dmp(x) cerr << #x << " = " << x << endl
#define dmpn(x) cerr << #x << " = " << x << "; "
#define dmpl(x) cerr << "Line " << __LINE__ << ": " << #x << " = " << x << endl
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define pb push_back
#define ff first
#define ss second
#define all(x) begin(x), end(x)
#define sz(x) (int)x.size()
#define contains(s,x) ((s).find(x) != (s).end())
const int MOD = 998244353;
struct LazySegtree {
int N;
vector<int> sums, flipped;
LazySegtree(vector<int> &a) {
N = pow(2, ceil(log2(sz(a))));
sums.assign(2 * N, 0);
flipped.assign(2 * N, 0);
for (int i = 0; i < sz(a); i++) if (a[i]) lazy_update(i, i + 1, 0, N, 1);
// dmp(sums);
// dmp(flipped);
}
int get_sum(int i, int j, int idx) {
if (flipped[idx]) return (j - i) - sums[idx];
return sums[idx];
}
int query(int l, int r, int i, int j, int idx = 1) {
// aktualny je cely v povodnom
if (l <= i && j <= r) {
return get_sum(i, j, idx);
// prekryva sa
} else if ((i <= l && l < j) || (i < r && r <= j)) {
flipped[idx * 2] ^= flipped[idx];
flipped[idx * 2 + 1] ^= flipped[idx];
flipped[idx] = 0;
int mid = (i + j) / 2;
return query(l, r, i, mid, idx * 2) + query(l, r, mid, j, idx * 2 + 1);
}
return 0;
}
int lazy_update(int l, int r, int i, int j, int idx = 1) {
if (l <= i && j <= r) {
flipped[idx] ^= 1;
} else if ((i <= l && l < j) || (i < r && r <= j)) {
flipped[idx * 2] ^= flipped[idx];
flipped[idx * 2 + 1] ^= flipped[idx];
flipped[idx] = 0;
int mid = (i + j) / 2;
sums[idx] = lazy_update(l, r, i, mid, idx * 2) + lazy_update(l, r, mid, j, idx * 2 + 1);
}
return get_sum(i, j, idx);
}
void print_base_row(int l, int r) {
for (int i = l; i < r; i++) cout << query(i, i + 1, 0, N) << " ";
cout << endl;
}
};
int N, Q;
vector<vector<int>> g;
vector<int> intimes, tops, is_evens, parents;
int dfs1(int v, int p) {
int size = 0, mx = 0, mxi = -1;
is_evens[v] = (sz(g[v]) == 1) ? 0 : 1;
parents[v] = p;
for (int u : g[v]) if (u != p) {
int usz = dfs1(u, v);
if (usz > mx) {
mx = usz;
mxi = u;
}
size += usz;
if (!is_evens[u]) is_evens[v] ^= 1;
}
if (mxi != -1 && mxi != 0) swap(g[v][0], g[v][mxi]);
return size;
}
int dfs2(int v, int p, int time, int top) {
intimes[v] = time;
tops[v] = top;
for (int i = 0; i < sz(g[v]); i++) if (g[v][i] != p) {
int u = g[v][i];
if (i == 0) time = dfs2(u, v, time + 1, top);
else time = dfs2(u, v, time + 1, u);
}
return time;
}
void solve() {
cin >> N >> Q;
g.assign(N, {});
is_evens.assign(N, 0);
parents.assign(N, -1);
intimes.assign(N, 0);
tops.assign(N, 0);
for (int i = 0; i < N - 1; i++) {
int u, v;
cin >> u >> v;
u--;
v--;
g[u].pb(v);
g[v].pb(u);
}
int root = 0, leaves = 0;
for (int i = 0; i < N; i++) {
if (sz(g[i]) > 1) root = i;
else leaves++;
}
dfs1(root, -1);
dfs2(root, -1, 0, root);
vector<int> base(N, 0);
for (int i = 0; i < N; i++) base[intimes[i]] = is_evens[i];
LazySegtree st(base);
while (Q--) {
bool even = (leaves % 2 == 0);
int K;
cin >> K;
vector<pii> updates;
for (int i = 0; i < K; i++) {
int v;
cin >> v;
v--;
if (sz(g[v]) == 1) continue;
even ^= 1;
while (v != -1) {
updates.pb({ intimes[tops[v]], intimes[v] + 1 });
st.lazy_update(updates.back().ff, updates.back().ss, 0, st.N);
v = parents[tops[v]];
}
}
// dmp(updates);
// st.print_base_row(0, N);
if (!even) cout << -1 << endl;
else {
int even_cnt = st.query(0, N, 0, st.N);
int ans = N + K - 1 + even_cnt;
if (st.query(intimes[root], intimes[root] + 1, 0, st.N)) ans--;
cout << ans << endl;
}
for (pii pr : updates) st.lazy_update(pr.ff, pr.ss, 0, st.N);
}
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
344 KB |
Output is correct |
2 |
Incorrect |
210 ms |
3720 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
5 ms |
980 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1043 ms |
69376 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1054 ms |
11700 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
278 ms |
7832 KB |
Output is correct |
2 |
Incorrect |
301 ms |
8180 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
434 ms |
12624 KB |
Output is correct |
2 |
Execution timed out |
1074 ms |
15064 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
344 KB |
Output is correct |
2 |
Incorrect |
210 ms |
3720 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |