Submission #1262571

#TimeUsernameProblemLanguageResultExecution timeMemory
1262571A_M_NamdarRailway (BOI17_railway)C++20
100 / 100
76 ms24900 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10, LG = 20;
int n, m, k, par[N][LG], h[N], cnt[N], st[N];
vector<int> adj[N], tr, ans;
pair<int, int> edge[N];

void dfs(int u) {
    st[u] = tr.size();
    tr.push_back(u);
    for (int v: adj[u]) 
        if (v != par[u][0]) {
            h[v] = h[u] + 1, par[v][0] = u;
            dfs(v);
        }
}

void pre() {
    par[0][0] = n;
    dfs(0);
    for (int j = 1; j < LG; j++) 
        for (int i = 0; i < n; i++) 
            if (h[i] >= (1 << j)) 
                par[i][j] = par[par[i][j - 1]][j - 1];
}

int lca(int u, int v) {
    if (h[u] < h[v]) swap(u, v);
    for (int i = LG - 1; i >= 0; i--) 
        if (h[u] - (1 << i) >= h[v]) 
            u = par[u][i];
    if (u == v) return u;
    for (int i = LG - 1; i >= 0; i--) 
        if (h[u] >= (1 << i) && par[u][i] != par[v][i]) 
            u = par[u][i], v = par[v][i];
    return par[u][0];
}

void add_path(int u, int v) {
//    cout << u << ' ' << v << " : " << lca(u, v) << '\n';
    cnt[u]++;
    cnt[v]++;
    cnt[lca(u, v)] -= 2;
}

void dfs_relax(int u) {
    for (int v: adj[u]) 
        if (v != par[u][0]) {
            dfs_relax(v);
            cnt[u] += cnt[v];
        }
//    cout << u + 1 << ' ' << cnt[u] << '\n';
}

void input() {
    cin >> n >> m >> k;
    for (int i = 0; i < n - 1; i++) {
        int u, v;
        cin >> u >> v;
        u--, v--;
        adj[u].push_back(v);
        adj[v].push_back(u);
        edge[i] = {u, v};
    }
}

void solve() {
    pre();
    for (int i = 0; i < m; i++) {
        int sz;
        cin >> sz;
        vector<int> vec(sz);
        for (int j = 0; j < sz; j++) {
            cin >> vec[j];
            vec[j]--;
        }
        sort(vec.begin(), vec.end(), [](int p1, int p2) {
                return st[p1] < st[p2];
        });
        for (int j = 1; j < sz; j++) 
            add_path(vec[j], vec[j - 1]);
        add_path(vec[0], vec[sz - 1]);
    }
    dfs_relax(0);
    for (int i = 0; i < n - 1; i++) {
        if (h[edge[i].first] > h[edge[i].second]) 
            swap(edge[i].first, edge[i].second);
        if (cnt[edge[i].second] >= 2 * k) 
            ans.push_back(i + 1);
    }
}

void output() {
    cout << ans.size() << '\n';
    for (int u: ans) 
        cout << u << ' ';
}

int main() {
    ios:: sync_with_stdio(0), cin.tie(0), cout.tie(0);
    input();
    solve();
    output();
}
#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...