// #include <bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <map>
#include <unordered_map>
#include <vector>
#include <iomanip>
#include <string>
#include <queue>
#include <set>
#include <deque>
using namespace std;
#define int long long
#define endl "\n"
#define fi first
#define se second
const int M=1e9+7;
const int inf = 1e18;
const int LOG=17;
const int N=2e5+5;
int n , m , c , w , k , t=1 , q=1 , x , y , z , l , r;
vector<int>a[N];
int p[LOG][N];
int di[N];
int vl[N];
int ch[N];
map<pair<int,int>,int>d;
int in[N],out[N];
vector<int> lis;
void dfs(int x,int y){
in[x]=lis.size();
lis.push_back(x);
for (int i:a[x]){
if (i==y)continue;
ch[x]++;
di[i]=di[x]+1;
p[0][i]=x;
dfs(i,x);
}
out[x]=lis.size();
lis.push_back(x);
}
void makest(){
for (int j=1;j<LOG;j++){
for (int i=1;i<=n;i++){
p[j][i]=p[j-1][p[j-1][i]];
}
}
}
int bl(int x,int d){
int k=LOG-1;
while(k>=0){
if (d>=(1<<k)){
x=p[k][x];
d-=(1<<k);
}
k--;
}
return x;
}
int lca(int x,int y){
if (di[x]>di[y]){
swap(x,y);
}
x=bl(x,di[y]-di[x]);
if (x==y)return x;
int k=LOG-1;
while (k>=0){
if (p[k][x]!=p[k][y]){
x=p[k][x];
y=p[k][y];
}
k--;
}
return p[0][x];
}
bool comp(pair<int,int>x,pair<int,int>y){
return x.se-x.fi>y.se-y.fi;
}
void solve(){
cin >> n >> m >> k;
for (int i=1;i<=n-1;i++){
cin >> x >> y;
a[x].push_back(y);
a[y].push_back(x);
d[{x,y}]=d[{y,x}]=i;
}
dfs(1,0);
makest();
for (int i=0;i<m;i++){
cin >> k;
vector<pair<int,int>>op(k);
for (int j=0;j<k;j++){
cin >> x;
op[j]={in[x],out[x]};
}
map<int,vector<int>>ai;
sort(op.rbegin(),op.rend(),comp);
set<pair<int,int>>s;
map<int,int>pi;
for (auto [x,y]:op){
int u=lis[x];
auto it=s.lower_bound({x,y});
while (it!=s.end()){
ai[u].push_back(lis[(*it).fi]);
s.erase(*it);
it=s.lower_bound({x,y});
}
s.insert({x,y});
}
int z=lis[(*s.begin()).fi];
queue<int>o;
for (auto i:s){
z=lca(z,lis[i.fi]);
o.push(lis[i.fi]);
pi[lis[i.fi]]=z;
}
while (o.size()){
int h=o.front();
o.pop();
vl[h]++;
vl[pi[h]]--;
for (int i:ai[h]){
o.push(i);
pi[i]=h;
}
}
}
queue<int>o;
vector<int>vi(n+1);
for (int i=1;i<=n;i++){
if (!ch[i]){
o.push(i);
vi[i]=1;
}
}
vector<int>jk;
while (o.size()){
int h=o.front();
o.pop();
for (int i:a[h]){
if (vi[i])continue;
ch[i]--;
if (vl[h]>=k){
jk.push_back(d[{i,h}]);
}
vl[i]+=vl[h];
if (!ch[i]){
o.push(i);
vi[i]=1;
}
}
}
// for (int i=1;i<=n;i++){
// cout << vl[i] << " ";
// }
// cout << endl;
sort(jk.begin(),jk.end());
cout << jk.size() << endl;
for (int i:jk){
cout << i << " ";
}
cout << endl;
}
signed main()
{
ios::sync_with_stdio(0);//DO NOT USE IN INTERACTIVE
cin.tie(0), cout.tie(0);//DO NOT USE IN INTERACTIVE
cout << fixed << setprecision(9);
srand(time(0));
// int t=1;
// cin >> t;
for (int _=1;_<=t;_++){
solve();
q++;
}
}
| # | 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... |