Submission #1268114

#TimeUsernameProblemLanguageResultExecution timeMemory
1268114ducdevRailway (BOI17_railway)C++17
7 / 100
40 ms22856 KiB
// Author: 4uckd3v - Nguyen Cao Duc #include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAX_N = 1e5; const int MOD = 1e9 + 7; int n, q, k, timer, lg; int edge[MAX_N + 5], tin[MAX_N + 5], tout[MAX_N + 5], dp[MAX_N + 5]; bool ok[MAX_N + 5]; int up[MAX_N + 5][18]; vector<int> adj[MAX_N + 5]; void dfs(int u, int par) { tin[u] = ++timer; up[u][0] = par; for (int i = 1; i <= lg; i++) up[u][i] = up[up[u][i - 1]][i - 1]; for (int id : adj[u]) { int v = edge[id] ^ u; if (v == par) continue; dfs(v, u); }; tout[u] = ++timer; }; bool isAncestor(int u, int v) { return tin[u] <= tin[v] && tout[u] >= tout[v]; }; int __lca(int u, int v) { if (isAncestor(u, v)) return u; if (isAncestor(v, u)) return v; for (int i = lg; i >= 0; i--) if (!isAncestor(up[u][i], v)) u = up[u][i]; return up[u][0]; }; void calc(int u, int par) { for (int id : adj[u]) { int v = edge[id] ^ u; if (v == par) continue; calc(v, u); dp[u] += dp[v]; if (dp[v] >= 2 * k) ok[id] = true; }; }; int main() { ios_base::sync_with_stdio(0); cin.tie(0); if (fopen("MAIN.INP", "r")) { freopen("MAIN.INP", "r", stdin); freopen("MAIN.OUT", "w", stdout); }; cin >> n >> q >> k; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; adj[u].push_back(i); adj[v].push_back(i); edge[i] = u ^ v; }; lg = ceil(log2(n)); dfs(1, 1); while (q--) { int sz; cin >> sz; vector<int> vertex(sz); for (int &u : vertex) cin >> u; sort(vertex.begin(), vertex.end(), [&](int u, int v) { return tin[u] < tin[v]; }); if (sz == 1) continue; vertex.push_back(__lca(vertex[0], vertex[sz - 1])); for (int i = 0; i < sz; i++) { int u = vertex[i], v = vertex[i + 1]; int lca = __lca(u, v); dp[u]++, dp[v]++; dp[lca] -= 2; }; }; calc(1, 1); cout << accumulate(ok + 1, ok + n, 0) << '\n'; for (int i = 1; i < n; i++) if (ok[i]) cout << i << ' '; };

Compilation message (stderr)

railway.cpp: In function 'int main()':
railway.cpp:60:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   60 |         freopen("MAIN.INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
railway.cpp:61:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |         freopen("MAIN.OUT", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...