Submission #747437

#TimeUsernameProblemLanguageResultExecution timeMemory
747437vjudge1Railway (BOI17_railway)C++17
0 / 100
291 ms524288 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 100001;
const int K = 20;

int n, m, k, x;
vector<pair<int, int>> g[MAXN];
int cnt[MAXN], up[MAXN][K], d[MAXN];

void dfs(int u, int p = 0) {
    up[u][0] = p;
    for (int i = 1; i < K; i++) {
        up[u][i] = up[up[u][i-1]][i-1];
    }
    for (auto [v, idx] : g[u]) {
        if (v != p) {
            d[v] = d[u] + 1;
            dfs(v, u);
        }
    }
}

int lca(int a, int b) {
    int i=19;
    if(d[a]>d[b])swap(a, b);
    while(i>=0 && d[a] < d[b]){
        if(d[up[a][i]]>d[b])a=up[a][i];
        i--;
    }
    a=up[a][0];
    for(i=19;i>0;i--){
        if(up[a][i]!=up[b][i]){
            a=up[a][i];
            b=up[b][i];
        }
    }
    return up[a][0];
}
vector<int> ans;
int dfs2(int x, int p, int id){
    for(auto i : g[x]){
        if(x!=p);
        cnt[x]+=dfs2(i.first, x, i.second);
    }
    if(cnt[x]>=k && id)ans.push_back(id);
    return cnt[x];
}
int main()
{
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> n >> m >> k;
    for (int i = 1; i <= n - 1; i++) {
        int a, b; cin >> a >> b;
        g[a].push_back({b,i});
        g[b].push_back({a,i});
    }
    dfs(1);
    for (int i = 1; i <= m; i++) {
        cin >> x;
        assert(x == 2);
        int a, b; cin >> a >> b;
        int u = lca(a, b);
        cnt[u] -= 2;
        cnt[a]++;
        cnt[b]++;
    }
    dfs2(1, 0, 0);
    cout<<ans.size()<<'\n';
    for(int i:ans)cout<<i<<' ';
    cout<<endl;
    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...