#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define all(v) v.begin(), v.end()
#define F first
#define S second
const int N = 100010;
int lift[N][21];
vector<int> adj[N],level(N,0),dep(N,0),v(N,0),ans;
map<pair<int,int>, int> E;
int cnt = 0,n,m,k;
void dfs(int node,int p){
level[node] = cnt++;
dep[node] = (node != 0) ? dep[p] + 1 : 1;
lift[node][0] = p;
for(auto go : adj[node]){
if(go != p) dfs(go, node);
}
}
int dfsans(int node,int p){
int sm = v[node];
for(auto go : adj[node]){
if(go != p) sm += dfsans(go, node);
}
if(sm / 2 >= k && node != 0) ans.pb(E[{min(node, p), max(node, p)}]);
return sm;
}
int LCA(int x,int y){
if(dep[x] < dep[y]) swap(x, y);
for(int layer = 19; layer >= 0; layer--){
if(dep[x] - dep[y] >= (1ll << layer)) x = lift[x][layer];
}
if(x == y) return x;
for(int layer = 19; layer >= 0; layer--){
if(lift[x][layer] != lift[y][layer]){
x = lift[x][layer];
y = lift[y][layer];
}
}
return lift[x][0];
}
void calclift(){
for(int layer = 1; layer <= 19; layer++){
for(int i = 0; i < n; i++) lift[i][layer] = lift[lift[i][layer-1]][layer-1];
}
}
void _(){
cin >> n >> m >> k;
for(int i = 1; i <= n - 1; i++){
int u,v;
cin >> u >> v;
u--,v--;
adj[u].pb(v);
adj[v].pb(u);
E[{min(u, v), max(u, v)}] = i;
}
dfs(0, -1);
calclift();
while(m--){
int siz;
cin >> siz;
deque<int> nodes;
for(int i = 0; i < siz; i++){
int x;
cin >> x;
x--;
nodes.pb(x);
}
sort(all(nodes), [](int a, int b){
return level[a] < level[b];
});
int lowest = nodes[0];
for(int i = 1; i < siz; i++) lowest = LCA(lowest, nodes[i]);
nodes.push_front(lowest);
for(int i = 0; i < nodes.size(); i++){
int anc = LCA(nodes[i], nodes[(i + 1) % nodes.size()]);
v[anc] -= 2;
v[nodes[i]] += 1;
v[nodes[(i + 1) % nodes.size()]] += 1;
}
}
dfsans(0, -1);
sort(all(ans));
cout << ans.size() << endl;
for(auto pr : ans) cout << pr << " ";
cout << endl;
}
int32_t main()
{
int t = 1;
//cin >> t;
while(t--) _();
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... |