제출 #542724

#제출 시각아이디문제언어결과실행 시간메모리
542724skittles1412Railway (BOI17_railway)C++17
100 / 100
99 ms22980 KiB
#include "bits/extc++.h" using namespace std; template <typename T> void dbgh(const T& t) { cerr << t << endl; } template <typename T, typename... U> void dbgh(const T& t, const U&... u) { cerr << t << " | "; dbgh(u...); } #ifdef DEBUG #define dbg(...) \ cerr << "L" << __LINE__ << " [" << #__VA_ARGS__ << "]" \ << ": "; \ dbgh(__VA_ARGS__) #else #define cerr \ if (false) \ cerr #define dbg(...) #endif #define endl "\n" #define long int64_t #define sz(x) int((x).size()) const int maxn = 1e5 + 5, logn = 20; int t, tin[maxn], tout[maxn], lift[logn][maxn]; vector<int> graph[maxn]; void dfs(int u, int p = -1) { tin[u] = t++; lift[0][u] = p; for (auto& v : graph[u]) { if (v != p) { dfs(v, u); } } tout[u] = t++; } bool anc(int u, int v) { return tin[u] <= tin[v] && tout[v] <= tout[u]; } int lca(int u, int v) { if (anc(u, v)) { return u; } for (int i = logn - 1; i >= 0; i--) { int nu = lift[i][u]; if (nu != -1 && !anc(nu, v)) { u = nu; } } return lift[0][u]; } void solve() { int n, q, k; cin >> n >> q >> k; int edges[n - 1][2]; for (auto& [u, v] : edges) { cin >> u >> v; u--; v--; graph[u].push_back(v); graph[v].push_back(u); } dfs(0); for (int i = 1; i < logn; i++) { for (int j = 0; j < n; j++) { if (lift[i - 1][j] == -1) { lift[i][j] = -1; } else { lift[i][j] = lift[i - 1][lift[i - 1][j]]; } } } int psum[n * 2 + 1] {}; auto add = [&](int l, int r) -> void { psum[l]++; psum[r + 1]--; }; while (q--) { dbg("Q"); int m; cin >> m; int arr[m]; for (auto& a : arr) { cin >> a; a--; } sort(arr, arr + m, [&](int a, int b) -> bool { return tin[a] < tin[b]; }); vector<int> vtree(arr, arr + m); for (int i = 0; i < m - 1; i++) { vtree.push_back(lca(arr[i], arr[i + 1])); } sort(begin(vtree), end(vtree), [&](int a, int b) -> bool { return tin[a] < tin[b]; }); vtree.erase(unique(begin(vtree), end(vtree)), vtree.end()); vector<int> stk; for (auto& a : vtree) { dbg(a); } for (auto& a : vtree) { while (sz(stk) && !anc(stk.back(), a)) { stk.pop_back(); } if (sz(stk)) { dbg(stk.back(), a); add(tin[stk.back()] + 1, tin[a]); } stk.push_back(a); } } for (int i = 0; i < 2 * n; i++) { psum[i + 1] += psum[i]; } for (int i = 0; i < n; i++) { dbg(i, psum[tin[i]] - psum[tout[i]]); } vector<int> ans; for (int i = 0; i < n - 1; i++) { auto [u, v] = edges[i]; if (lift[0][u] == v) { swap(u, v); } if (psum[tin[v]] - psum[tout[v]] >= k) { ans.push_back(i); } } cout << sz(ans) << endl; for (int i = 0; i < sz(ans); i++) { cout << ans[i] + 1 << " \n"[i == sz(ans) - 1]; } } int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); cin.exceptions(ios::failbit); solve(); }

컴파일 시 표준 에러 (stderr) 메시지

railway.cpp: In function 'void solve()':
railway.cpp:112:14: warning: unused variable 'a' [-Wunused-variable]
  112 |   for (auto& a : vtree) {
      |              ^
#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...