Submission #1313031

#TimeUsernameProblemLanguageResultExecution timeMemory
1313031Born_To_LaughRailway (BOI17_railway)C++17
100 / 100
66 ms24188 KiB
// Born_To_Laugh - Hughie Do
#include <bits/stdc++.h>
#define alle(AC) AC.begin(), AC.end()
#define fi first
#define se second
using namespace std;
typedef long long ll;
[[maybe_unused]] const ll MOD = 998244353, INF = 1e9 + 7;

const int maxn = 1e5 + 10;
int n, m, k;
vector<pair<int,int>> adj[maxn];
vector<int> ans;
int eid[maxn], tin[maxn], val[maxn];
int dep[maxn];
int binlift[maxn][20];
int id = 0;

void dfs(int a, int par){
    tin[a] = ++id;
    for(auto &edge: adj[a]){
        int elm = edge.fi;
        if(elm == par)continue;
        
        binlift[elm][0] = a;
        for(int i=1; i<20; ++i){
            binlift[elm][i] = binlift[binlift[elm][i - 1]][i - 1];
        }

        eid[elm] = edge.se;
        dep[elm] = dep[a] + 1;

        dfs(elm, a);
    }
}
void dfscal(int a, int par){
    for(auto &edge: adj[a]){
        int elm = edge.fi;
        if(elm == par)continue;
        dfscal(elm, a);
        val[a] += val[elm];
    }
    if(val[a] >= 2 * k && a != 1)ans.push_back(eid[a]);
}
int lca(int a, int b){
    if(dep[a] < dep[b])swap(a, b);
    int k = dep[a] - dep[b];
    for(int i=0; i<20; ++i){
        if(k & (1 << i))a = binlift[a][i];
    }
    if(a == b)return a;
    for(int i=19; i>=0; --i){
        if(binlift[a][i] != binlift[b][i]){
            a = binlift[a][i];
            b = binlift[b][i];
        }
    }
    return binlift[a][0];
}
void solve(){
    cin >> n >> m >> k;
    for(int i=1; i<n; ++i){
        int a, b;cin >> a >> b;
        adj[a].push_back({b, i});
        adj[b].push_back({a, i});
    }
    dfs(1, -1);
    for(int i=1; i<=m; ++i){
        int x;cin >> x;
        vector<int> sth(x + 1, 0);
        for(int j=1; j<=x; ++j)cin >> sth[j];

        sort(sth.begin() + 1, sth.end(), [&](int a, int b){
            return tin[a] < tin[b];
        });

        for(int j=1; j<=x; ++j){
            int b, a = sth[j];
            if(j == x)b = sth[1];
            else b = sth[j + 1];

            int c = lca(a, b);
            val[a]++;
            val[b]++;
            val[c] -= 2;
        }
    }
    dfscal(1, -1);
    sort(alle(ans));
    cout << ans.size() << '\n';
    for(auto &elm: ans)cout << elm << ' ';
    
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    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...