제출 #922601

#제출 시각아이디문제언어결과실행 시간메모리
922601codefoxRailway (BOI17_railway)C++14
100 / 100
529 ms148284 KiB
#include <bits/stdc++.h>

using namespace std;

#pragma GCC target("popcnt")
#define pii pair<int, int>

vector<vector<pii>> graph;
vector<vector<int>> lift;
vector<int> depth;
vector<bitset<10000>> start;
vector<int> ende;
vector<int> minis;

void dfs(int i, int p, int d)
{
    depth[i] = d;
    for (pii ele:graph[i])
    {
        if (ele.first==p) continue;
        lift[0][ele.first] = i;
        dfs(ele.first, i, d+1);
    }
}

int finde(int a, int b)
{
    if (depth[a]<depth[b]) swap(a, b);
    int diff = depth[a]-depth[b];
    for (int i = 17; i >= 0; i--)
    {
        if (diff < (1<<i)) continue;
        diff -= 1<<i;
        a = lift[i][a];
    }
    if (a ==b) return a;
    for (int i = 17; i >= 0; i--)
    {
        if (lift[i][a]==lift[i][b]) continue;
        a = lift[i][a];
        b = lift[i][b];
    }
    return lift[0][a];
}

int dfs2(int i, int p)
{
    int e = ende[i];
    for (pii ele:graph[i])
    {
        if (ele.first == p) continue;
        int f = dfs2(ele.first, i);
        minis[ele.second] += start[ele.first].count()-f;
        start[i]|=start[ele.first];
        e+=f;
    }
    return e;
}

int32_t main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);

    int n, m, k;
    cin >> n >> m >> k;

    graph.assign(n, vector<pii>());
    lift.assign(18, vector<int>(n, -1));
    depth.assign(n, 0);
    ende.assign(n, 0);
    start.assign(n, 0);
    minis.assign(n, 0);

    for (int i = 1; i < n; i++)
    {
        int a, b;
        cin >> a >> b;
        a--; b--;
        graph[a].push_back({b, i});
        graph[b].push_back({a, i});
    }
    dfs(0, -1, 0);

    for (int i = 1; i < 18; i++)
    {
        for (int j = 0;  j < n; j++)
        {
            int next = lift[i-1][j];
            if (next == -1) continue;
            lift[i][j] = lift[i-1][next];
        }
    }

    for (int i = 0; i <= m/10000; i++)
    {
        ende.assign(n, 0);
        start.assign(n, 0);
        for (int j = 0; j < min(10000, m-(i*10000)); j++)
        {
            int s;
            cin >> s;
            int lca =0;
            for (int h = 0; h < s; h++) 
            {
                int a;
                cin >> a;
                a--;
                if (h==0) lca = a;
                else lca = finde(a, lca);
                start[a][j] = 1;
            }
            ende[lca]++;
        }
        dfs2(0, -1);
    }
    vector<int> sol;
    
    for (int i = 0; i < n; i++)
    {
        if (minis[i]>=k) sol.push_back(i);
    }
    cout << sol.size() << "\n";
    for (int ele:sol) cout << ele << " ";

    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...