Submission #1285383

#TimeUsernameProblemLanguageResultExecution timeMemory
1285383peanutRailway (BOI17_railway)C++20
100 / 100
83 ms23332 KiB
#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e5 + 5;

int n, m, k;
vector<int> adj[maxn];
int timer;
int val[maxn];
int tin[maxn], up[maxn][20], depth[maxn];
pair<int, int> edges[maxn];
int id[maxn];
vector<int> ans;
void dfs(int u, int p)
{
  tin[u] = ++timer;
  for (auto v : adj[u])
  {
    if (v == p) continue;
    depth[v] = depth[u] + 1;
    up[v][0] = u;
    for (int i = 1; i < 20; ++i) up[v][i] = up[up[v][i-1]][i-1];
    dfs(v, u);
  }
}
int lca(int u, int v)
{
  if (depth[u] < depth[v]) swap(u, v);
  int k = depth[u] - depth[v];
  for (int i = 0; i < 20; ++i) if (k >> i & 1) u = up[u][i];
  if (u == v) return u;
  for (int i = 19; i >= 0; --i)
  {
    if (up[u][i] != up[v][i])
    {
      u = up[u][i];
      v = up[v][i];
    }
  }
  return up[u][0];
}
void dfs2(int u, int p)
{
  for (auto v : adj[u])
  {
    if (v == p) continue;
    dfs2(v, u);
    val[u] += val[v];
  }
  if (u != 1 && val[u] / 2 >= k) ans.push_back(id[u]);
}
int main()
{
  ios::sync_with_stdio(false); 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);
    adj[v].push_back(u);
    edges[i] = {u, v};
  }
  dfs(1, 0);
  for (int i = 1; i < n; ++i)
  {
    int u = edges[i].first;
    int v = edges[i].second;
    if (depth[u] < depth[v]) swap(u, v);
    id[u] = i;
  }
  for (int i = 1; i <= m; ++i)
  {
    int s; cin >> s;
    vector<int> nd(s);
    for (int j = 0; j < s; ++j) cin >> nd[j];
    sort(nd.begin(), nd.end(), [&](int u, int v){return tin[u] < tin[v];});
    for (int j = 0; j < s; ++j)
    {
      int u = nd[j];
      int v = nd[(j+1)%s];
      val[u]++;
      val[v]++;
      val[lca(u, v)] -= 2;
    }
  }
  dfs2(1, 0);
  sort(ans.begin(), ans.end());
  cout << ans.size() << '\n';
  for (auto i : ans) cout << i << ' ';
  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...