Submission #1253914

#TimeUsernameProblemLanguageResultExecution timeMemory
1253914ankiteRailway (BOI17_railway)C++20
100 / 100
104 ms22984 KiB
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;

const int li = 1e5 + 5;
struct edge{ int v, id; };

int n, m, k, tin[li], tout[li], tick = 0, anc[li][21], p_edge[li];
vector<edge> adj[li];

void dfs(int node = 1, int par = 0) {
    tin[node] = ++tick;
    for (int i=1; i<=19; i++) anc[node][i] = anc[anc[node][i-1]][i-1];

    for (edge& other : adj[node]) {
        if (other.v == par) continue;
        anc[other.v][0] = node;
        p_edge[other.v] = other.id;
        dfs(other.v, node);
    }

    tout[node] = tick;
}

bool is_anc(int a, int b) { return (tin[b] >= tin[a]  &&  tout[b] <= tout[a]); }

int lca(int a, int b) {
    if (is_anc(a, b)) return a;

    for (int i=19; ~i; i--) if (anc[a][i]  &&  !is_anc(anc[a][i], b)) a = anc[a][i];
    return anc[a][0];
}

int fen[li];
void update(int pos, int val) { for (; pos <= n; pos += pos & (-pos)) fen[pos] += val; }
int query(int pos) { int ans = 0; for(;pos; pos -= pos & (-pos)) ans += fen[pos]; return ans; }
int get(int l, int r) { return query(r) - query(l - 1); }

int chosen[li];

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

    dfs();
    while (m--) {
        int s;
        cin >> s;
        for (int i=1; i<=s; i++) cin >> chosen[i];

        sort(chosen + 1, chosen + s + 1, [](int x, int y) { return tin[x] < tin[y]; });

        chosen[s + 1] = chosen[1];
        for (int i=1; i<=s; i++) {
            int l = lca(chosen[i], chosen[i + 1]);
            update(tin[chosen[i]], 1);
            update(tin[chosen[i + 1]], 1);
            update(tin[l], -2);
        }
    }
    vector<int> ans;
    k <<= 1;
    for (int i=2; i<=n; i++) {
        if (get(tin[i], tout[i]) >= k) ans.push_back(p_edge[i]);
    }

    sort(ans.begin(), ans.end());
    cout << ans.size() << '\n';
    for (int i : ans) cout << i << ' ';
}
#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...