Submission #889570

#TimeUsernameProblemLanguageResultExecution timeMemory
889570shiomusubi496Railway (BOI17_railway)C++17
100 / 100
129 ms29320 KiB
#include <bits/stdc++.h>

using namespace std;

#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define rrep(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
#define all(v) begin(v), end(v)

using ll = long long;

struct edge {
    int to, id;
    edge(int to_, int id_) : to(to_), id(id_) {}
};

using Graph = vector<vector<edge>>;

class LowestCommonAncestor {
    int n, h;
    Graph G;
    vector<vector<int>> par;
    vector<int> ord, dep;
    int cnt = 0;

    void dfs(int v, int p) {
        par[0][v] = p;
        ord[v] = cnt++;
        for (auto e : G[v]) {
            if (e.to == p) continue;
            dep[e.to] = dep[v] + 1;
            dfs(e.to, v);
        }
    }

public:
    LowestCommonAncestor(Graph G_) : G(G_) {
        n = G.size();
        h = 1;
        while ((1 << h) < n) ++h;
        ++h;
        par.assign(h, vector<int>(n, -1));
        ord.resize(n);
        dep.resize(n); dep[0] = 0;
        cnt = 0;
        dfs(0, -1);
        rep (i, h - 1) rep (j, n) par[i + 1][j] = par[i][j] == -1 ? -1 : par[i][par[i][j]];
    }
    int lca(int a, int b) {
        if (dep[a] < dep[b]) swap(a, b);
        rrep (i, h) {
            if ((dep[a] - dep[b]) >> i & 1) a = par[i][a];
        }
        if (a == b) return a;
        rrep (i, h) {
            if (par[i][a] != par[i][b]) {
                a = par[i][a];
                b = par[i][b];
            }
        }
        return par[0][a];
    }
    int get_ord(int v) const { return ord[v]; }
};

int main() {
    int n, m, k; cin >> n >> m >> k;
    Graph g(n);
    rep (i, n - 1) {
        int a, b; cin >> a >> b;
        g[--a].emplace_back(--b, i);
        g[b].emplace_back(a, i);
    }
    LowestCommonAncestor lca(g);
    vector<int> imos(n);
    rep (i, m) {
        int s; cin >> s;
        vector<int> v(s);
        rep (j, s) cin >> v[j], --v[j];
        sort(all(v), [&](int a, int b) { return lca.get_ord(a) < lca.get_ord(b); });
        rep (j, s) {
            int a = v[j], b = v[(j + 1) % s];
            int c = lca.lca(a, b);
            ++imos[a]; ++imos[b];
            imos[c] -= 2;
        }
    }
    vector<int> ans;
    auto dfs = [&](auto&& self, int v, int p) -> void {
        for (auto e : g[v]) {
            if (e.to == p) continue;
            self(self, e.to, v);
            if (imos[e.to] >= k * 2) ans.push_back(e.id + 1);
            imos[v] += imos[e.to];
        }
    };
    dfs(dfs, 0, -1);
    sort(all(ans));
    cout << ans.size() << endl;
    rep (i, ans.size()) {
        cout << ans[i];
        if (i != ans.size() - 1) cout << " ";
    }
    cout << endl;
}

Compilation message (stderr)

railway.cpp: In function 'int main()':
railway.cpp:101:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  101 |         if (i != ans.size() - 1) cout << " ";
      |             ~~^~~~~~~~~~~~~~~~~
#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...