Submission #1306664

#TimeUsernameProblemLanguageResultExecution timeMemory
1306664tntRailway (BOI17_railway)C++20
100 / 100
62 ms24232 KiB
#include <bits/stdc++.h>
using namespace std;
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("Ofast,unroll-loops,fast-math,O3")

#define pb push_back                    
#define ll long long
#define f first
#define s second
#define sz(v) int(v.size())
#define all(v) v.begin(),v.end()

int mod =  1e9 + 7;
const int N = 2e5;
const int inf = 1e9;
int up[N][20],tin[N],tout[N],d[N];
int timer;
vector <int> g[N];
vector <pair <int,int>> e;
void calc(int u,int p){
    tin[u] = ++timer;
    up[u][0] = p;
    for(int i = 1; i < 20; i++){
        up[u][i] = up[up[u][i - 1]][i - 1];
    }
    for(auto to : g[u]){
        if(to == p) continue;
        d[to] = d[u] + 1;
        calc(to,u);
    }
    tout[u] = timer;
}
int pr(int u,int v){
    return (tin[v] <= tin[u] && tout[v] >= tout[u]);
}
int lca(int u,int v){
    if(pr(u,v)) return v;
    if(pr(v,u)) return u;
    for(int i = 19; i >= 0; i--){
        if(!pr(v,up[u][i])) u = up[u][i];
    }
    return up[u][0];
}
int cnt[N],sz[N];
void dfs(int u,int p){
    sz[u] = cnt[u];
    for(auto to : g[u]){
        if(to == p) continue;
        dfs(to,u);
        sz[u] += sz[to];
    }
}
void solve(){
    int n,m,k;
    cin >> n >> m >> k;
    for(int i = 1; i < n; i++){
        int u,v;
        cin >> u >> v;
        e.pb({u,v});
        g[u].pb(v),g[v].pb(u);
    }
    calc(1,1);
    vector <pair<int,int>> st;
    while(m--){
        int d;
        cin >> d;
        while(d--){
            int x;
            cin >> x;
            st.pb({tin[x],x});
        }
        sort(all(st));
        st.pb(st[0]);
        for(int i = 0; i < st.size() - 1; i++){
            int u = st[i].s,v = st[i + 1].s;
            int lc = lca(u,v);
            cnt[u]++,cnt[v]++,cnt[lc] -= 2;
        }
        st.clear();
    }
    dfs(1,1);
    vector <int> ans;
    for(int i = 0; i < e.size(); i++){
        int u = e[i].f,v = e[i].s;
        if(d[u] > d[v]) swap(u,v);
        if(sz[v] >= 2 * k) ans.pb(i + 1);
    }
    cout << ans.size() << '\n';
    for(auto to : ans) cout << to << ' ';
}

signed main(){
    //freopen("time.in", "r", stdin);
    //freopen("time.out", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int t1 = 1;
    while(t1--){
    	solve(); 
    }
}  
#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...