//Huyduocdithitp
#include<bits/stdc++.h>
typedef long long ll;
#define endl '\n'
#define fi first
#define se second
#define pii pair<ll,ll>
#define N 100005
#define LOG 18
using namespace std;
bool ghuy4g;
ll n, m, k;
ll high[N], sz[N], chain_head[N], chain_id[N], cur_pos, cur_chain, in[N], out[N], timeDfs, par[N], pos[N];
pii canh[N];
vector<ll> adj[N];
ll lca(ll u, ll v) {
while (chain_id[u] != chain_id[v]) {
if (chain_id[u] > chain_id[v]){
u = par[chain_head[chain_id[u]]];
}
else {
v = par[chain_head[chain_id[v]]];
}
}
if (high[u] > high[v]) return v;
else return u;
}
ll is_anc(ll u, ll v) {
return (in[u] <= in[v] && in[v] <= out[u]);
}
void dfs(ll u, ll parent) {
in[u] = ++timeDfs;
sz[u] = 1;
for (auto v : adj[u]) {
if (v == parent) continue;
high[v] = high[u] + 1;
dfs(v, u);
par[v] = u;
sz[u] += sz[v];
}
out[u] = timeDfs;
}
void hld(ll u, ll parent) {
if (chain_head[cur_chain] == 0) {
chain_head[cur_chain] = u;
}
chain_id[u] = cur_chain;
pos[u] = cur_pos;
cur_pos ++ ;
ll nxt = 0;
for (auto v : adj[u]) {
if (v == parent) continue;
if (sz[v] > sz[nxt]) {
nxt = v;
}
}
if (nxt) {
hld(nxt, u);
}
for (auto v : adj[u]) {
if (v == parent || v == nxt) continue;
cur_chain ++ ;
hld(v, u);
}
}
ll f[4 * N], st[4 * N];
void lazy(ll id) {
if (f[id] == 0) return;
st[id] += f[id];
if (id * 2 < 4 * N) {
f[id * 2] += f[id];
}
if (id * 2 + 1 < 4 * N) {
f[id * 2 + 1] += f[id];
}
f[id] = 0;
}
void update(ll id, ll l, ll r, ll L, ll R, ll v) {
lazy(id);
if (l > R || r < L) return;
if (L <= l && r <= R) {
f[id] += v;
lazy(id);
return;
}
ll mid = (l + r) / 2;
update(id * 2, l, mid, L, R, v);
update(id * 2 + 1, mid + 1, r, L, R, v);
st[id] = st[id * 2] + st[id * 2 + 1];
}
void upd(ll u, ll v, ll tt) {
while (chain_id[u] != chain_id[v]) {
ll r = chain_head[chain_id[u]];
update(1, 1, n, pos[r], pos[u], 1);
u = par[r];
}
update(1, 1, n, pos[v] + 1, pos[u], 1);
}
ll cnt = 0;
ll get(ll id, ll l, ll r, ll i) {
//return 0;
////cout << id << " " << l << " " << r << " " << i << endl;
//exit(0);
lazy(id);
if (i > r || i < l) return 0;
if (l == r) return st[id];
ll mid = (l + r) / 2;
return get(id * 2, l, mid, i) + get(id * 2 + 1, mid + 1, r, i);
}
void pre() {
dfs(1, 1);
cur_pos = cur_chain = 1;
hld(1, 1);
}
bool cmp(ll u, ll v) {
return in[u] < in[v];
}
stack<ll> St;
void xly() {
ll k;
vector<ll> vt;
cin >> k;
ll lc = 0;
for (int i = 1; i <= k; i ++) {
ll u; cin >> u;
vt.push_back(u);
if (lc == 0) lc = u;
else {
lc = lca(u, lc);
}
}
sort(vt.begin(), vt.end(), cmp);
for (auto it : vt) {
//cout << it << " ";
}
//cout << endl;
upd(vt[0], lc, 1);
//cout << " upd " << vt[0] << " " << lc << endl;
for (int i = 1; i < k; i ++) {
ll x = lca(vt[i], vt[i - 1]);
upd(vt[i], x, 1);
//cout << " upd " << vt[i] << " " << x << endl;
}
}
void solve() {
for (int i = 1; i <= m; i ++) {
xly();
}
//return;
vector<ll> res;
for (int i = 1; i <= n - 1; i ++) {
ll u = canh[i].fi, v = canh[i].se;
if (u == par[v]) swap(u, v);
//cout << u << " " << pos[u] << endl;
//continue;
ll x = get(1, 1, n, pos[u]);
//continue;
//cout << x << endl;
if (x >= k) {
res.push_back(i);
}
}
//return;
cout << res.size() << endl;
for (auto it : res) {
cout << it << " ";
}
}
bool klinh;
signed main() {
//freopen("test.inp", "r", stdin);
//freopen("test.out", "w", stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> k;
for (int i = 1; i <= n - 1; i ++) {
ll u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
canh[i] = {u, v};
}
pre();
solve();
cerr << fabs(&klinh - &ghuy4g) / double(1024 * 1024);
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |