#include <bits/stdc++.h>
using namespace std;
using ll=long long;
template <typename T> using vec=vector<T>;
constexpr char nl='\n';
#define fi first
#define se second
#define pb push_back
#define sz(c) (int)(c).size()
#define all(c) c.begin(),c.end()
#define rep(a, b) for(decltype(b) a=0; a<b; ++a)
#ifdef LOCAL
#define DEBUG 1
#else
#define DEBUG 0
#endif
#define ifbug if constexpr(DEBUG)
#define bug(...) ifbug{cerr<<"["#__VA_ARGS__"]: ";bug__(__VA_ARGS__);cerr<<'\n';}
template <typename...A> void bug__(A&&...a){((cerr<<a<<' '),...);}
struct DebugStream {
template <typename T>
constexpr DebugStream& operator<<(T&& value) const {
ifbug std::cerr<<std::forward<T>(value);
return const_cast<DebugStream&>(*this);
}
};
inline constexpr DebugStream cbug{};
constexpr int N=1e5+6;
constexpr int L=20;
vec<pair<int, int>> adj[N]; // {index krawedzi, wierzcholek}
int pre[N]; int post[N];
int dep[N];
int jmp[N][L];
int dp[N];
int ans[N];
int tmr=0;
void dfs(int a, int p) {
dep[a]=dep[p]+1;
jmp[a][0]=p;
pre[a]=++tmr;
for(const auto &[i, b]:adj[a]) {
if(b!=p) {
dfs(b, a);
}
}
post[a]=++tmr;
}
void lift(int &a, int h) {
for(int l=L-1; l>=0; --l) {
if((h>>l)&1) {
a=jmp[a][l];
}
}
}
int lca(int a, int b) {
if(dep[a]<dep[b]) { swap(a, b); }
lift(a, dep[a]-dep[b]);
if(a==b) { return a; }
for(int l=L-1; l>=0; --l) {
int a2=jmp[a][l]; int b2=jmp[b][l];
if(a2!=b2) { a=a2; b=b2; }
}
return jmp[a][0];
}
void dfs_dp(int a, int p, int i) {
for(const auto &[j, b]:adj[a]) {
if(b!=p) {
dfs_dp(b, a, j);
dp[a]+=dp[b];
}
}
// bug(a, p, i, dp[a]);
ans[i]=dp[a];
}
bool is_anc(int a, int b) {
return pre[a]<=pre[b] && post[b]<=post[a];
}
int32_t main() {
cin.tie(0)->sync_with_stdio(0);
int n,m,k;
cin>>n>>m>>k;
for(int i=1; i<=n-1; ++i) {
int a,b;
cin>>a>>b;
adj[a].pb({i, b});
adj[b].pb({i, a});
}
// preprocess
dfs(1, 0);
for(int l=1; l<L; ++l) {
for(int i=1; i<=n; ++i) {
jmp[i][l]=jmp[jmp[i][l-1]][l-1];
}
}
// queries
rep(_, m) {
int s;
cin>>s;
vec<int> wie(s);
for(int i=0; i<s; ++i) { cin>>wie[i]; }
sort(all(wie), [&](int a, int b) {
return pre[a]<pre[b];
});
for(int i=1; i<s; ++i) {
int przodek=lca(wie[i], wie[i-1]);
wie.pb(przodek);
}
sort(all(wie), [&](int a, int b) {
return pre[a]<pre[b];
});
wie.erase(unique(all(wie)), wie.end());
stack<int> st;
st.push(wie[0]);
for(int i=1; i<sz(wie); ++i) {
int x=wie[i];
while(!st.empty() && !is_anc(st.top(), x)) { st.pop(); }
int parent=st.top();
dp[x]+=1;
dp[parent]-=1;
st.push(x);
}
}
dfs_dp(1, 0, 0);
vec<int> kra;
for(int i=1; i<=n-1; ++i) {
if(ans[i]>=k) { kra.pb(i); }
}
cout<<sz(kra)<<nl;
sort(all(kra));
for(const auto &i:kra) { cout<<i<<' '; }
cout<<nl;
}
| # | 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... |