Submission #467590

#TimeUsernameProblemLanguageResultExecution timeMemory
467590izhang05Railway (BOI17_railway)C++17
100 / 100
315 ms44792 KiB
#include <bits/stdc++.h>

using namespace std;

//#define DEBUG
void setIO(const string &name) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin.exceptions(istream::failbit);
#ifdef LOCAL
    freopen((name + ".in").c_str(), "r", stdin);
    freopen((name + ".out").c_str(), "w", stdout);
    freopen((name + ".out").c_str(), "w", stderr);
#endif
}

const int inf = 0x3f3f3f3f, mod = 1e9 + 7, maxn = 1e5 + 5, maxs = 20;
vector<pair<int, int>> adj[maxn];
int up[maxn][maxs], depth[maxn], n, tin[maxn];
vector<int> order;

int jmp(int x, int d) {
    for (int i = 0; i < maxs; i++) {
        if ((d >> i) & 1) {
            x = up[x][i];
        }
    }
    return x;
}

int lca(int x, int y) {
    if (depth[x] < depth[y]) {
        swap(x, y);
    }
    x = jmp(x, depth[x] - depth[y]);
    if (x == y) {
        return x;
    }
    for (int i = maxs - 1; i >= 0; --i) {
        int new_x = up[x][i], new_y = up[y][i];
        if (new_x != new_y) {
            x = new_x, y = new_y;
        }
    }
    return up[x][0];
}

int dist(int x, int y) {
    int l = lca(x, y);
    return depth[x] - depth[l] + depth[y] - depth[l];
}

void dfs(int c = 0, int p = -1, int d = 0) {
    up[c][0] = p;
    depth[c] = d;
    order.push_back(c);
    for (auto &i : adj[c]) {
        if (i.first != p) {
            dfs(i.first, c, d + 1);
        }
    }
}

void build() {
    for (int i = 1; i < maxs; ++i) {
        for (int j = 0; j < n; ++j) {
            if (up[j][i - 1] == -1) {
                up[j][i] = -1;
            } else {
                up[j][i] = up[up[j][i - 1]][i - 1];
            }
        }
    }
}

vector<int> sol;

int k;
unordered_map<int, int> diff[maxn];
int cnt[maxn];

void dfs2(int c, int p, int path) {
    for (auto &i : diff[c]) {
        if (i.second > 0) {
            ++cnt[c];
        }
    }
    for (auto &i : adj[c]) {
        if (i.first != p) {
            dfs2(i.first, c, i.second);
            if (diff[i.first].size() > diff[c].size()) {
                swap(diff[i.first], diff[c]);
                swap(cnt[i.first], cnt[c]);
            }
            for (auto &j : diff[i.first]) {
                diff[c][j.first] += j.second;
                int cur = diff[c][j.first];
                if (cur <= j.second && cur > 0) {
                    ++cnt[c];
                } else if (cur <= 0 && cur - j.second > 0) {
                    --cnt[c];
                }
            }
            diff[i.first].clear();
        }
    }
    if (cnt[c] >= k) {
        sol.push_back(path + 1);
    }
}


int main() {
    setIO("1");
    int m;
    cin >> n >> m >> k;
    for (int i = 0; i < n - 1; ++i) {
        int a, b;
        cin >> a >> b;
        --a, --b;
        adj[a].emplace_back(b, i);
        adj[b].emplace_back(a, i);
    }
    dfs();
    build();
    for (int i = 0; i < m; ++i) {
        int s;
        cin >> s;
        vector<int> a(s);
        for (int j = 0; j < s; ++j) {
            cin >> a[j];
            --a[j];
        }
        int l = a[0];
        for (int j = 0; j < s; ++j) {
            ++diff[a[j]][i];
            l = lca(l, a[j]);
        }
        diff[l][i] -= s;
    }
    dfs2(0, -1, -1);
    sort(sol.begin(), sol.end());
    cout << sol.size() << "\n";
    for (auto &i : sol) {
        cout << i << " ";
    }
    cout << "\n";
    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...