結果
問題 |
No.3189 Semifinal Stage
|
ユーザー |
|
提出日時 | 2025-06-22 10:26:16 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 931 ms / 4,000 ms |
コード長 | 3,558 bytes |
コンパイル時間 | 2,616 ms |
コンパイル使用メモリ | 216,556 KB |
実行使用メモリ | 31,232 KB |
最終ジャッジ日時 | 2025-06-22 10:26:39 |
合計ジャッジ時間 | 19,975 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 30 |
ソースコード
#include <bits/stdc++.h> using namespace std; template<class T> istream& operator >> (istream& is, vector<T>& vec) { for(T& x : vec) is >> x; return is; } template<class T> ostream& operator << (ostream& os, const vector<T>& vec) { if(vec.empty()) return os; os << vec[0]; for(auto it = vec.begin(); ++it != vec.end(); ) os << ' ' << *it; return os; } struct LCA_DFS { using Graph = std::vector<std::vector<int>>; int N, LOGV; std::vector<std::vector<int>> table; std::vector<int> ord, ent, depth; Graph &g; LCA_DFS(Graph G) : g(G), N(G.size()), ent(N), depth(N) { int dep = 0; ord.reserve(2 * N); auto dfs = [&](auto dfs, int v, int p) -> void { ent[v] = ord.size(); depth[v] = dep; ord.emplace_back(v); for(auto u : g[v]){ if(u == p) continue; dep++; dfs(dfs, u, v); dep--; ord.emplace_back(v); } if(g[v].size() != 1) ord.pop_back(); }; dfs(dfs, 0, -1); const int m = ord.size(); LOGV = std::__lg(m) + 1; table.resize(LOGV, vector<int>(m)); std::copy(ord.begin(), ord.end(), table[0].begin()); for(int i = 1; i < LOGV; i++) { for(int j = 0; j + (1 << i) < m; j++) { table[i][j] = comp(table[i - 1][j], table[i - 1][j + (1 << (i - 1))]); } } } inline int comp(int u, int v){ return depth[u] < depth[v] ? u : v; } int lca(int u, int v){ if(u == v) return u; u = ent[u], v = ent[v]; if(u > v) std::swap(u, v); int b = std::__lg(v - u); u = table[b][u]; v = table[b][v - (1 << b)]; return comp(u, v); } int dist(int u, int v){ return depth[u] + depth[v] - 2 * depth[lca(u, v)]; } }; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector<vector<int>> G(n); for(int i = 1; i < n; i++){ int u, v; cin >> u >> v; u--, v--; G[u].emplace_back(v); G[v].emplace_back(u); } LCA_DFS tree(G); int q; cin >> q; vector<pair<int,int>> query(q); for(auto &&[cmd, v] : query) cin >> cmd >> v, v--; queue<int> que; vector<bool> tb(n); vector<int> tre, idx(n, -1), dp(n); for(int l = 0; l < q; l += 1024){ int r = min(q, l + 1024); tre.clear(); for(int i = l; i < r; i++){ auto [cmd, v] = query[i]; if(cmd == 1) idx[v] = i; } for(int i = 0; i < n; i++){ dp[i] = 1 << 30; if(l <= idx[i] && idx[i] < r){ tre.emplace_back(i); }else{ if(tb[i]){ que.emplace(i); dp[i] = 0; } } } while(!que.empty()){ int v = que.front(); que.pop(); for(auto u : G[v]){ if(dp[v] + 1 >= dp[u]) continue; dp[u] = dp[v] + 1; que.emplace(u); } } for(int i = l; i < r; i++){ auto [cmd, v] = query[i]; if(cmd == 1){ tb[v] = tb[v] ? false : true; }else{ int mn = dp[v]; for(auto u : tre){ if(tb[u]) mn = min(mn, tree.dist(v, u)); } cout << mn << '\n'; } } } }