Submission #1271723

#TimeUsernameProblemLanguageResultExecution timeMemory
1271723kigdewRailway (BOI17_railway)C++20
36 / 100
54 ms21696 KiB
#include <bits/stdc++.h>
using namespace std;

#define             ll    long long
#define            pii   pair<int,int>
template<class T> void   maximize(T& a,const T& b) {if (a < b) a = b;}
template<class T> void   minimize(T& a,const T& b) {if (a > b) a = b;}
#define             fi   first
#define             sc   second
#define     mset(c, x)   memset(c, x, sizeof(c))
#define   __11HA7_KZ2__  signed main()

int dx[8] = {0, 1, 0,-1, 1, 1,-1,-1};
int dy[8] = {1, 0,-1, 0, 1,-1,-1, 1};

const int N = 1e5;
const int INF = 1e9;
const ll LINF = 1e18;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

int n, m, k;
vector <pii> adj[N+15];
int timer, tin[N+15], tout[N+15];
int up[20][N+15], sum[N+15], edge_to_node[N+15];

void dfs1(int u, int p) {
    tin[u] = ++timer;

    up[0][u] = p;
    for (int k = 1; k <= 17; k++) {
        up[k][u] = up[k-1][up[k-1][u]];
    }

    for (auto [v, id] : adj[u]) {
        if (v != p) {
            edge_to_node[id] = v;
            dfs1(v, u);
        }
    }
    tout[u] = timer;
}

void dfs2(int u, int p) {
    for (auto [v, id] : adj[u]) {
        if (v != p) {
            dfs2(v, u);
            sum[u] += sum[v];
        }
    }
}

bool isAncestor(int u, int v) {
    return tin[u] <= tin[v] and tout[v] <= tout[u];
}

int lca(int u, int v) {
    if (isAncestor(u, v)) return u;
    if (isAncestor(v, u)) return v;
    for (int k = 17; k >= 0; k--) {
        if (!isAncestor(up[k][u], v)) {
            u = up[k][u];
        }
    }
    return up[0][u];
}

 __11HA7_KZ2__
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m >> k;
    for (int i = 1; i < n; i++) {
        int u, v; cin >> u >> v;
        adj[u].push_back({v, i});
        adj[v].push_back({u, i});
    }

    timer = 0;
    dfs1(1, 1);

    for (int i = 1; i <= m; i++) {
        int s; cin >> s;
        int pre;
        for (int j = 1; j <= s; j++) {
            int x; cin >> x;
            if (j != 1) {
                int anc = lca(x, pre);
                sum[x]++; sum[pre]++;
                sum[anc] -= 2;
            }
            pre = x;
        }
    }

    dfs2(1, 1);

    vector <int> ans;
    for (int e = 1; e < n; e++) {
        int u = edge_to_node[e];
        if (sum[u] >= k) ans.push_back(e);
    }

    cout << ans.size() << '\n';
    for (int x : ans) cout << x <<' ';
}


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