Submission #869652

#TimeUsernameProblemLanguageResultExecution timeMemory
869652ArashJafariyanRailway (BOI17_railway)C++17
0 / 100
1044 ms40016 KiB
#include <bits/stdc++.h>
using namespace std;
using pii = array<int, 2>;
using piii = array<int, 3>;

#define pb push_back

const int LG = 16 + 2, N = 1e5 + 4;

int n, m, k, cnt[N];
set<piii> sack; // {dep, startingVertex, visited}

struct Node {
    int h, e, bc, anc[LG];
    vector<int> dep;
    vector<pii> adj;
} g[N];

int prepare(int v = 0, int p = 0) {
    if (!v)
        g[v].anc[0] = -1;
    for (int i = 1; i < LG; ++i) {
        int u = g[v].anc[i - 1];
        if (u != -1) 
            g[v].anc[i] = g[u].anc[i - 1];
        else 
            g[v].anc[i] = -1;
    }

    g[v].bc = -1;
    int ret = 1, curMax = 0;
    for (auto [u, idxE] : g[v].adj) {
        if (u != p) {
            g[u].h = g[v].h + 1;
            g[u].e = idxE;
            g[u].anc[0] = v;

            int res = prepare(u, v);
            ret += res;
            if (res > curMax) {
                curMax = res;
                g[v].bc = u; 
            }
        }
    }
    return ret;
}

int anc(int v, int dis) {
    for (int i = 0; i < LG; ++i) 
        if ((1 << i) & dis) 
            v = g[v].anc[i];
    return v;
}

void del(int v, int p) {
    for (int dep : g[v].dep) {
        auto pt = sack.lower_bound({dep, -1, -1});
        sack.erase(pt);
    }

    for (auto [u, idxE] : g[v].adj) 
        if (u != p)
            del(u, v);
}

void add(int v, int p, int r) {
    for (int dep : g[v].dep) {
        auto pt = sack.lower_bound({dep, -1, -1});
        piii t;

        if (pt != sack.end()) {
            t = *pt;
            if (t[2] == r) {
                int w = anc(v, g[v].h - g[r].h - 1);
                ++cnt[g[w].e];
            }
            else {
                int w = anc(v, g[v].h - g[r].h - 1);
                ++cnt[g[w].e];

                w = (t[1], g[t[1]].h - g[r].h - 1);
                ++cnt[g[w].e];
                sack.erase(pt);
                t[2] = r;
                sack.insert(t);
            }
        }
    }

    for (auto [u, idxE] : g[v].adj) 
        if (u != p)
            add(u, v, r);
}

void dfs(int v = 0, int p = 0) {
    for (auto [u, idxE] : g[v].adj) {
        if (u != p && u != g[v].bc) {
            dfs(u, v);
            del(u, v);
        }
    }

    if (g[v].bc != -1) 
        dfs(g[v].bc, v);
    for (auto [u, idxE] : g[v].adj) 
        if (u != p && u != g[v].bc) 
            add(u, v, v);

    for (int dep : g[v].dep) {
        auto pt = sack.lower_bound({dep, -1, -1});
        
        if (pt != sack.end()) {
            piii t = *pt;
            if (t[2] != v) {
                int w = anc(t[1], g[t[1]].h - g[v].h - 1);
                ++cnt[g[w].e];
                
                sack.erase(pt);
                t[2] = v;
                sack.insert(t);
            }
        }
    }
    for (int dep : g[v].dep) 
        sack.insert({dep, v, -1});
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m >> k;
    for (int i = 0; i < n - 1; ++i) {
        int v, u;
        cin >> v >> u;
        --v, --u;
        g[v].adj.pb({u, i});
        g[u].adj.pb({v, i});
    }
    for (int i = 0; i < m; ++i) {
        int s;
        cin >> s;
        while (s--) {
            int v;
            cin >> v;
            --v;
            g[v].dep.pb(i);
        }
    }

    prepare();
    dfs();

    vector<int> out;
    for (int i = 0; i < n - 1; ++i) {
        if (cnt[i] >= k) {
            out.pb(i);
        }
        cout << cnt[i] << ' ';
    }
    cout << '\n';

    cout << out.size() << '\n';
    for (int edge : out)
        cout << edge + 1 << ' ';

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