Submission #1156907

#TimeUsernameProblemLanguageResultExecution timeMemory
1156907tungkhoa08Railway (BOI17_railway)C++17
0 / 100
1096 ms24904 KiB
#include <bits/stdc++.h>
using namespace std;
#define i2 pair<int,int>
int kq,ttt[200005],kt[200004],dp[100005][23],h[200005],n,m,k,dem[200004];
vector <i2>g[200005];
vector <int>luu;
void dfs(int u,int pa){
    //cout<<u<<' ';
    for (i2 i:g[u]){
        int v=i.first;
        int tt=i.second;
        if (v!=pa){
            h[v]=h[u]+1;
            dp[v][0]=u;
            ttt[v]=tt;
            dfs(v,u);
        }
    }
}
void ktao(){
    for (int i=1;i<=20;i++){
        for (int u=1;u<=n;u++) dp[u][i]=dp[dp[u][i-1]][i-1];
    }
}
int lca(int u,int v){
    if (h[u]<h[v]) swap(u,v);
    if (h[u]!=h[v]){
        int k=h[u]-h[v];
        for (int i=20;i>=0;i--){
            int ok=(k>>i)&1;
            if (ok==1) u=dp[u][i];
        }
    }
    if (u==v) return u;
    int k=log2(h[u]);
    for (int i=k;i>=0;i--){
        int u1=dp[u][i];
        int v1=dp[v][i];
        if (u1!=v1){
            u=dp[u][i];
            v=dp[v][i];
        }
    }
    return dp[u][0];
}
void dfs1(int u,int chung){
   if (u==chung) return;
   kt[ttt[u]]=1;
   dfs1(dp[u][0],chung);
}
void work(){
    for (int i:luu){
        for (int j:luu) if (i!=j){
            int chung=lca(i,j);
            dfs1(i,chung);
            dfs1(j,chung);
        }
    }
    //dfs1(5,1);
    for (int i=1;i<=n-1;i++) if (kt[i]==1) dem[i]++;
    for (int i=1;i<=n-1;i++) kt[i]=0;;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
//    freopen("suaduong.inp","r",stdin);
//    freopen("suaduong.out","w",stdout);
    cin>>n>>m>>k;
    for (int i=1;i<=n-1;i++){
        int u,v;
        cin>>u>>v;
        g[u].push_back({v,i});
        g[v].push_back({u,i});
    }
    dfs(1,0);
    ktao();
    for (int i=1;i<=m;i++){
        int x;
        cin>>x;
        for (int j=1;j<=x;j++){
            int u;
            cin>>u;
            luu.push_back(u);
        }
        work();
        luu.clear();
    }
    for (int i=1;i<=n-1;i++) if (dem[i]>=k) kq++;
    cout<<kq<<'\n';
    for (int i=1;i<=n-1;i++) if (dem[i]>=k) cout<<i<<' ';
    return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...