标签:
A
简单题
B
简单题
C
简单题
D
简单题
E
一棵树 给你2个点 求树上有多少个点到这两个点的距离相等
LCA倍增法
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 100010; int anc[maxn][20]; int fa[maxn], L[maxn], sum[maxn]; int n; int first[maxn], cnt; struct edge { int u, v, next; }e[maxn*2]; void AddEdge(int u, int v) { e[cnt].v = v; e[cnt].next = first[u]; first[u] = cnt++; e[cnt].v = u; e[cnt].next = first[v]; first[v] = cnt++; } void pre() { for(int i = 1; i <= n; i++) { anc[i][0] = fa[i]; for(int j = 1; (1<<j) < n; j++) anc[i][j] = -1; } for(int j = 1; (1<<j) < n; j++) for(int i = 1; i <= n; i++) if(anc[i][j-1] != -1) { int a = anc[i][j-1]; anc[i][j] = anc[a][j-1]; } } int query(int p, int q) { int log; if(L[p] < L[q]) swap(p, q); for(log = 1; (1<<log) <= L[p]; log++); log--; for(int i = log; i >= 0; i--) if(L[p] - (1<<i) >= L[q]) { p = anc[p][i]; } if(p == q) return p; for(int i = log; i >= 0; i--) { if(anc[p][i] != -1 && anc[p][i] != anc[q][i]) { p = anc[p][i]; q = anc[q][i]; } } if(p != q) p = anc[p][0]; return p; } int getkth(int u, int k) { int log; for(log = 1; (1<<log) <= k; log++); log--; for(int i = log; i >= 0; i--) if(k >= (1<<i)) { k -= (1<<i); u = anc[u][i]; } return u; } void dfs(int u, int f) { fa[u] = f; sum[u] = 1; for(int i = first[u]; i != -1; i = e[i].next) { int v = e[i].v; if(v == f) continue; L[v] = L[u]+1; dfs(v, u); sum[u] += sum[v]; } } int main() { memset(first, -1, sizeof(first)); cnt = 0; scanf("%d", &n); for(int i = 1; i < n; i++) { int u, v; scanf("%d %d", &u, &v); AddEdge(u, v); } L[1] = 0; dfs(1, -1); pre(); int q; scanf("%d", &q); while(q--) { int u, v; scanf("%d %d", &u, &v); if(u == v) { printf("%d\n", n); continue; } int rt = query(u, v); int d = L[u] + L[v] - 2*L[rt]; if(d%2) { printf("%d\n", 0); continue; } if(L[u] == L[v]) { u = getkth(u, d/2-1); v = getkth(v, d/2-1); printf("%d\n", n-sum[u]-sum[v]); } else { if(L[u] < L[v]) swap(u, v); v = getkth(u, d/2-1); u = getkth(u, d/2); printf("%d\n", sum[u]-sum[v]); } } return 0; }
Codeforces Round #294 (Div. 2)
标签:
原文地址:http://blog.csdn.net/u011686226/article/details/44059753