結果
| 問題 |
No.3189 Semifinal Stage
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-06-22 10:17:02 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,590 ms / 4,000 ms |
| コード長 | 3,556 bytes |
| コンパイル時間 | 2,592 ms |
| コンパイル使用メモリ | 216,424 KB |
| 実行使用メモリ | 31,292 KB |
| 最終ジャッジ日時 | 2025-06-22 10:17:33 |
| 合計ジャッジ時間 | 28,608 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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 += 512){
int r = min(q, l + 512);
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';
}
}
}
}