Submission #1053860

#TimeUsernameProblemLanguageResultExecution timeMemory
1053860ArthuroWichRailway (BOI17_railway)C++17
100 / 100
89 ms37308 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long int
vector<pair<int, int>> adj[100005];
int succ[100005][20], from[100005], dep[100005], st[100005], en[100005], seg[4*100005], timer = 0;
void update(int n, int l, int r, int i, int v) {
    if (l == r) {
        seg[n] += v;
    } else {
        int m = (l+r)/2;
        if (l <= i && i <= m) {
            update(2*n, l, m, i, v);
        } else {
            update(2*n+1, m+1, r, i, v);
        }
        seg[n] = seg[2*n] + seg[2*n+1];
    }
}
int query(int n, int l, int r, int a, int b) {
    if (b < l || r < a) {
        return 0;
    } else if (a <= l && r <= b) {
        return seg[n];
    } else {
        int m = (l+r)/2;
        return query(2*n, l, m, a, b)+query(2*n+1, m+1, r, a, b);
    }
}
void dfs(int i, int p) {
    st[i] = timer;
    timer++;
    for (auto [j, ind] : adj[i]) {
        if (j == p) {
            from[i] = ind;
            continue;
        }
        dep[j] = dep[i]+1;
        succ[j][0] = i;
        dfs(j, i);
    }
    en[i] = timer;
}
void initsucc(int n) {
    for (int j = 1; j < 20; j++) {
        for (int i = 1; i <= n; i++) {
            succ[i][j] = succ[succ[i][j-1]][j-1];
        }
    }
}
int kthjump(int a, int k) {
    for (int j = 0; j < 20; j++) {
        if (k & (1 << j)) {
            a = succ[a][j];
        }
    }
    return a;
}
int lca(int a, int b) {
    if (dep[a] > dep[b]) {
        swap(a, b);
    }
    b = kthjump(b, dep[b]-dep[a]);
    if (a == b) {
        return a;
    }
    for (int j = 19; j >= 0; j--) {
        if (succ[a][j] != succ[b][j]) {
            a = succ[a][j];
            b = succ[b][j];
        }
    }
    return succ[a][0];
}
bool cmp(int a, int b) {
    return st[a] < st[b];
}
void solve() {
    int n, m, k;
    cin >> n >> m >> k;
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back({v, i});
        adj[v].push_back({u, i});
    }
    dfs(1, -1);
    initsucc(n);
    while(m--) {
        int c, l;
        cin >> c;
        vector<int> a(c);
        for (int &x : a) {
            cin >> x;
        }
        sort(a.begin(), a.end(), cmp);
        a.push_back(a[0]);
        for (int i = 0; i < c; i++) {
            l = lca(a[i], a[i+1]);
            update(1, 0, n-1, st[a[i]], 1);
            update(1, 0, n-1, st[a[i+1]], 1);
            update(1, 0, n-1, st[l], -2);
        }
    }
    vector<int> ans;
    for (int i = 2; i <= n; i++) {
        if (query(1, 0, n-1, st[i], en[i]-1) >= 2*k) {
            ans.push_back(from[i]);
        }
    }
    sort(ans.begin(), ans.end());
    cout << ans.size() << endl;
    for (int i : ans) {
        cout << i << " ";
    }
    cout << endl;
}
int32_t main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t;
    t = 1;
    while(t--) {
        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...