Submission #1756000
Source Code Expand
#include <bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/pb_ds/tag_and_trait.hpp>
#define REP(i,n) for(int i=0;i<(int)(n);i++)
#define ALL(x) (x).begin(),(x).end()
using namespace std;
using namespace __gnu_pbds;
using ll = long long;
using ld = long double;
template <typename T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <typename T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template<typename T> T inf;
template<> constexpr int inf<int> = 1e9;
template<> constexpr ll inf<ll> = 1e18;
template<> constexpr ld inf<ld> = 1e30;
class LCA {
int size, log_size;
vector<vector<int>> parent;
vector<int> depth;
template <typename Edge>
void dfs(const vector<vector<Edge>> &g, int v, int p, int d) {
parent[0][v] = p; depth[v] = d;
for (const Edge &e: g[v]) {
if (e.to != p) dfs(g, e.to, v, d + 1);
}
}
public:
template <typename Edge>
LCA(const vector<vector<Edge>> &g, int root) : size(g.size()), log_size(0), depth(size, 0) {
for (int v = size; v > 0; v /= 2) ++log_size;
parent.assign(log_size, vector<int>(size, 0));
dfs(g, root, -1, 0);
for (int k = 0; k < log_size - 1; ++k) {
for (int v = 0; v < size; ++v) {
if (parent[k][v] < 0) parent[k + 1][v] = -1;
else parent[k + 1][v] = parent[k][parent[k][v]];
}
}
}
int query(int u, int v) {
if (depth[u] > depth[v]) swap(u, v);
for (int k = 0; k < log_size; ++k)
if (((depth[v] - depth[u]) >> k) & 1) v = parent[k][v];
if (u == v) return u;
for (int k = log_size - 1; k >= 0; k--) {
if (parent[k][u] != parent[k][v]) {
u = parent[k][u];
v = parent[k][v];
}
}
return parent[0][u];
}
};
template <typename Edge>
vector<typename Edge::Cost> bfs01(const vector<vector<Edge>> &g, int s) {
using Cost = typename Edge::Cost;
vector<Cost> d(g.size(), inf<Cost>);
d[s] = 0;
deque<pair<Cost,int>> que;
que.emplace_back(0, s);
while (!que.empty()) {
auto top = que.front();
que.pop_front();
Cost dist = top.first; int v = top.second;
if (d[v] < dist) continue;
for (const auto &e: g[v]) {
if (d[e.to] > d[v] + e.cost) {
d[e.to] = d[v] + e.cost;
if (e.cost == 1) que.emplace_back(d[e.to], e.to);
else if (e.cost == 0) que.emplace_front(d[e.to], e.to);
else assert(false);
}
}
}
return d;
}
struct Edge {
using Cost = int;
int to;
Cost cost;
Edge(int t, Cost c) : to(t), cost(c) {}
};
using Graph = vector<vector<Edge>>;
void add_edge(Graph &g, int from, int to, Edge::Cost cost) {
g[from].emplace_back(to, cost);
g[to].emplace_back(from, cost);
}
int main() {
int n, q;
cin >> n;
Graph g(n);
REP(i,n-1) {
int s, t;
cin >> s >> t;
--s; --t;
add_edge(g, s, t, 1);
}
LCA lca(g, 0);
auto d = bfs01(g, 0);
cin >> q;
REP(i,q) {
int a, b;
cin >> a >> b;
--a; --b;
int v = lca.query(a, b);
cout << d[a] + d[b] - d[v] * 2 + 1 << endl;
}
return 0;
}
Submission Info
Submission Time |
|
Task |
D - 閉路 |
User |
asi1024 |
Language |
C++14 (GCC 5.4.1) |
Score |
100 |
Code Size |
3194 Byte |
Status |
AC |
Exec Time |
380 ms |
Memory |
16760 KB |
Judge Result
Set Name |
Sample |
Subtask1 |
Subtask2 |
Score / Max Score |
0 / 0 |
30 / 30 |
70 / 70 |
Status |
|
|
|
Set Name |
Test Cases |
Sample |
subtask0_sample01.txt, subtask0_sample02.txt, subtask0_sample03.txt |
Subtask1 |
subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt |
Subtask2 |
subtask0_sample01.txt, subtask0_sample02.txt, subtask0_sample03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt |
Case Name |
Status |
Exec Time |
Memory |
subtask0_sample01.txt |
AC |
1 ms |
256 KB |
subtask0_sample02.txt |
AC |
1 ms |
256 KB |
subtask0_sample03.txt |
AC |
1 ms |
256 KB |
subtask1_01.txt |
AC |
77 ms |
16120 KB |
subtask1_02.txt |
AC |
75 ms |
16120 KB |
subtask1_03.txt |
AC |
1 ms |
256 KB |
subtask1_04.txt |
AC |
1 ms |
256 KB |
subtask1_05.txt |
AC |
2 ms |
384 KB |
subtask1_06.txt |
AC |
2 ms |
384 KB |
subtask1_07.txt |
AC |
88 ms |
13824 KB |
subtask1_08.txt |
AC |
89 ms |
13816 KB |
subtask1_09.txt |
AC |
90 ms |
13696 KB |
subtask1_10.txt |
AC |
90 ms |
13696 KB |
subtask1_11.txt |
AC |
90 ms |
13696 KB |
subtask1_12.txt |
AC |
90 ms |
13696 KB |
subtask2_01.txt |
AC |
288 ms |
16760 KB |
subtask2_02.txt |
AC |
289 ms |
16632 KB |
subtask2_03.txt |
AC |
193 ms |
384 KB |
subtask2_04.txt |
AC |
202 ms |
512 KB |
subtask2_05.txt |
AC |
217 ms |
640 KB |
subtask2_06.txt |
AC |
217 ms |
768 KB |
subtask2_07.txt |
AC |
361 ms |
14200 KB |
subtask2_08.txt |
AC |
362 ms |
14072 KB |
subtask2_09.txt |
AC |
377 ms |
14072 KB |
subtask2_10.txt |
AC |
377 ms |
14072 KB |
subtask2_11.txt |
AC |
380 ms |
14072 KB |
subtask2_12.txt |
AC |
368 ms |
14072 KB |