Submission #1312986

#TimeUsernameProblemLanguageResultExecution timeMemory
1312986aaaaaaaaRailway (BOI17_railway)C++20
100 / 100
56 ms22996 KiB
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
const int mxN = 1e5 + 10;
const int mxB = 21;
vector<pair<int, int>> adj[mxN];
int st[mxN], eid[mxN], va[mxN], dp[mxN][mxB], depth[mxN], tin = 0;
void dfs(int u, int par){
    st[u] = ++tin, dp[u][0] = par, depth[u] = depth[par] + 1;
    dp[u][0] = par;
    for(int i = 1; i < mxB; ++i) dp[u][i] = dp[dp[u][i - 1]][i - 1];
    for(auto it : adj[u]){
        if(it.first ^ par){
            eid[it.first] = it.second;
            dfs(it.first, u);
        }
    }
}
void dfs2(int u, int par){
    for(auto it : adj[u]){
        if(it.first ^ par){
            dfs2(it.first, u);
            va[u] += va[it.first];
        }
    }
}
int kth(int u, int k){
        for(int i = 0; i < mxB; ++i){
            if(k & (1ll << i)) u = dp[u][i];
        }
        return u;
    }

    int lca(int u, int v){
        if(depth[u] < depth[v]) swap(u,v);
        u = kth(u, abs(depth[u] - depth[v]));
        if(u == v) return u;
        for(int i = mxB - 1; i >= 0; --i){
            if(dp[u][i] != dp[v][i]){
                u = dp[u][i];
                v = dp[v][i];
            }
        }
        return dp[u][0];
    }
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);
    int n, m, k;
    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(1, 0);
    auto update = [&](int u, int v) -> void {
        va[u] += 1, va[v] += 1;
        va[lca(u, v)] -= 2;
       // cout << lca(u, v) << " lca  " << u << " " << v << "\n";
    };
    while(m--){
        int sz; cin >> sz;
        vector<int> v(sz);
        for(int i = 0; i < sz; ++i) cin >> v[i];
        sort(all(v), [&](int x, int y){
            return st[x] < st[y];
        });
        v.push_back(v[0]);
        for(int i = 0; i < (int) v.size() - 1; ++i){
            update(v[i], v[i + 1]);
        }
    }
    dfs2(1, 0);
    vector<int> ans;
    for(int i = 2; i <= n; ++i){
        //cout << va[i] << " ";
        if(va[i] >= 2 * k) ans.push_back(eid[i]);
    } //cout << "\n";
    cout << (int) ans.size() << "\n";
    sort(all(ans));
    for(auto it : ans) cout << it << " ";
    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...