QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#409420 | #3171. Rooted Subtrees | ucup-team1716# | WA | 1ms | 5736kb | C++14 | 1.5kb | 2024-05-12 03:07:30 | 2024-05-12 03:07:30 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5;
int n, Q;
struct EDGE { int nxt, to; } edge[MAXN * 2 + 5];
int head[MAXN + 5], tot;
inline void add_edge(int u, int v) { edge[++tot].nxt = head[u]; edge[tot].to = v; head[u] = tot; }
int fa[MAXN + 5], sz[MAXN + 5], son[MAXN + 5], dep[MAXN + 5];
void dfs1(int u) {
sz[u] = 1;
for (int i = head[u]; i; i = edge[i].nxt) {
int v = edge[i].to;
if (v == fa[u])
continue;
fa[v] = u;
dep[v] = dep[u] + 1;
dfs1(v);
sz[u] += sz[v];
if (!son[u] || sz[v] > sz[son[u]])
son[u] = v;
}
}
int top[MAXN + 5], dfn[MAXN + 5], ofn[MAXN + 5], rev[MAXN + 5], cnt_dfn;
void dfs2(int u, int t) {
top[u] = t;
dfn[u] = ++cnt_dfn;
rev[cnt_dfn] = u;
if (son[u])
dfs2(son[u], t);
for (int i = head[u]; i; i = edge[i].nxt) {
int v = edge[i].to;
if (v == fa[u] || v == son[u])
continue;
dfs2(v, v);
}
ofn[u] = cnt_dfn;
}
int get_lca(int u, int v) {
while (top[u] != top[v]) {
if (dep[top[u]] < dep[top[v]])
swap(u, v);
u = fa[top[u]];
}
return (dep[u] < dep[v]) ? u : v;
}
int main() {
cin >> n >> Q;
for (int i = 1; i <= n - 1; ++i) {
int u, v;
cin >> u >> v;
add_edge(u, v);
add_edge(v, u);
}
dfs1(1);
dfs2(1, 1);
for (int i = 1; i <= n; ++i) cout << dep[i] << " "; cout << endl;
while (Q--) {
int u, v;
cin >> u >> v;
int lca = get_lca(u, v);
int len = dep[u] + dep[v] - 2 * dep[lca] + 1;
cout << n - len + ((long long)len + 1) * len / 2 << endl;
}
return 0;
}
详细
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 5736kb
input:
5 2 1 2 2 3 2 4 4 5 1 3 4 5
output:
0 1 2 2 3 8 6
result:
wrong answer 1st lines differ - expected: '8', found: '0 1 2 2 3 '