ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#444 | #76. 「NOIP2016」天天爱跑步 | Pigsyy | 100 | 5298ms | 126468kb | C++23 | 3.1kb | 2025-04-24 13:39:06 | 2025-04-24 13:39:07 |
answer
// NOIP2016 天天爱跑步
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 300005
#define mid ((l + r) >> 1)
int n, m;
int head[N << 1], ver[N << 1], nxt[N << 1];
int dep[N], lg[N], f[N][20];
int w[N], ans[N];
int rt[N][2];
int lc[N * 80], rc[N * 80], cnt[N * 80];
void add(int u, int v) {
static int tot = 0;
ver[++tot] = v;
nxt[tot] = head[u];
head[u] = tot;
}
void dfs(int u, int fa) {
f[u][0] = fa;
dep[u] = dep[fa] + 1;
for (int i = 1; i <= lg[dep[u]]; i++) {
f[u][i] = f[f[u][i - 1]][i - 1];
}
for (int i = head[u]; i; i = nxt[i]) {
int v = ver[i];
if (v != fa)
dfs(v, u);
}
}
int lca(int x, int y) {
if (dep[x] < dep[y])
swap(x, y);
while (dep[x] > dep[y]) {
x = f[x][lg[dep[x] - dep[y]]];
}
if (x == y)
return x;
for (int i = lg[dep[x]]; i >= 0; i--) {
if (f[x][i] != f[y][i]) {
x = f[x][i];
y = f[y][i];
}
}
return f[x][0];
}
void change(int x, int v, int l, int r, int &p) {
static int tot = 0;
if (!p)
p = ++tot;
if (l == r) {
cnt[p] += v;
return;
}
if (x <= mid)
change(x, v, l, mid, lc[p]);
else
change(x, v, mid + 1, r, rc[p]);
cnt[p] = cnt[lc[p]] + cnt[rc[p]];
}
int query(int x, int l, int r, int p) {
if (!p)
return 0;
if (l == r)
return cnt[p];
if (x <= mid)
return query(x, l, mid, lc[p]);
else
return query(x, mid + 1, r, rc[p]);
}
int merge(int p, int q, int l, int r) {
if (!p)
return q;
if (!q)
return p;
if (l == r) {
cnt[p] += cnt[q];
return p;
}
lc[p] = merge(lc[p], lc[q], l, mid);
rc[p] = merge(rc[p], rc[q], mid + 1, r);
cnt[p] = cnt[lc[p]] + cnt[rc[p]];
return p;
}
void sum(int u, int fa) {
for (int i = head[u]; i; i = nxt[i]) {
int v = ver[i];
if (v == fa)
continue;
sum(v, u);
rt[u][0] = merge(rt[u][0], rt[v][0], 1, n);
rt[u][1] = merge(rt[u][1], rt[v][1], -n, 2 * n);
}
int res = dep[u] + w[u] <= n ? query(dep[u] + w[u], 1, n, rt[u][0]) : 0;
ans[u] = res + query(dep[u] - w[u], -n, 2 * n, rt[u][1]);
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 2; i <= n; i++)
lg[i] = lg[i >> 1] + 1;
for (int i = 1, u, v; i < n; i++) {
scanf("%d %d", &u, &v);
add(u, v);
add(v, u);
}
for (int i = 1; i <= n; i++)
scanf("%d", w + i);
dfs(1, 0);
for (int i = 1, s, t, p; i <= m; i++) {
scanf("%d %d", &s, &t);
p = lca(s, t);
// 点差分
change(dep[s], 1, 1, n, rt[s][0]);
change(dep[s], -1, 1, n, rt[p][0]);
change(2 * dep[p] - dep[s], 1, -n, 2 * n, rt[t][1]);
change(2 * dep[p] - dep[s], -1, -n, 2 * n, rt[f[p][0]][1]);
}
sum(1, 0);
for (int i = 1; i <= n; i++)
printf("%d ", ans[i]);
return 0;
}
详细
小提示:点击横条可展开更详细的信息
Test #1:
score: 5
Accepted
time: 1ms
memory: 9924kb
input:
991 991 1 2 2 3 2 4 3 5 2 6 6 7 7 8 5 9 5 10 7 11 7 12 6 13 5 14 5 15 1 16 13 17 9 18 14 19 19 20 19...
output:
0 0 0 0 0 0 1 0 2 0 0 3 0 0 0 0 0 0 1 2 1 0 0 0 1 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ...
result:
ok 991 tokens
Test #2:
score: 5
Accepted
time: 0ms
memory: 12052kb
input:
991 991 1 2 2 3 2 4 3 5 3 6 1 7 2 8 8 9 5 10 8 11 9 12 5 13 5 14 12 15 11 16 7 17 10 18 3 19 9 20 15...
output:
0 0 1 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 1 0 3 0 0 2 0 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 0 0 0 0 1 0 0 0 2 0 ...
result:
ok 991 tokens
Test #3:
score: 5
Accepted
time: 8ms
memory: 9848kb
input:
992 992 1 2 2 3 1 4 4 5 4 6 6 7 7 8 4 9 9 10 3 11 6 12 7 13 12 14 7 15 13 16 9 17 15 18 10 19 7 20 2...
output:
2 2 0 1 1 1 0 2 1 3 0 2 1 1 1 2 0 1 0 3 1 0 2 1 1 0 0 1 0 1 2 2 1 2 1 2 1 2 0 1 1 0 1 1 1 1 2 0 1 3 ...
result:
ok 992 tokens
Test #4:
score: 5
Accepted
time: 0ms
memory: 9868kb
input:
992 992 1 2 1 3 3 4 4 5 2 6 5 7 5 8 1 9 2 10 4 11 2 12 12 13 3 14 12 15 10 16 13 17 11 18 4 19 2 20 ...
output:
1 1 1 0 1 1 0 1 2 0 1 2 0 2 1 0 0 2 1 1 1 0 0 1 0 0 1 0 1 3 2 3 0 2 4 0 1 0 1 0 0 1 1 1 1 4 1 2 0 3 ...
result:
ok 992 tokens
Test #5:
score: 5
Accepted
time: 3ms
memory: 9912kb
input:
993 993 1 2 1 3 2 4 1 5 4 6 2 7 4 8 6 9 2 10 7 11 2 12 9 13 2 14 11 15 10 16 5 17 4 18 12 19 13 20 1...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
result:
ok 993 tokens
Test #6:
score: 5
Accepted
time: 403ms
memory: 77756kb
input:
99994 99994 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 ...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
result:
ok 99994 tokens
Test #7:
score: 5
Accepted
time: 408ms
memory: 75984kb
input:
99994 99994 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 ...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
result:
ok 99994 tokens
Test #8:
score: 5
Accepted
time: 408ms
memory: 75496kb
input:
99994 99994 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 ...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
result:
ok 99994 tokens
Test #9:
score: 5
Accepted
time: 233ms
memory: 35496kb
input:
99995 99995 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 ...
output:
99995 99994 99994 99994 99994 99993 99993 0 99992 0 99991 99990 99988 99987 99987 99987 99986 0 9998...
result:
ok 99995 tokens
Test #10:
score: 5
Accepted
time: 236ms
memory: 37340kb
input:
99995 99995 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 ...
output:
99995 0 99994 99994 99993 0 99993 99993 99993 0 99993 99993 99992 99992 99992 99992 99992 0 99991 99...
result:
ok 99995 tokens
Test #11:
score: 5
Accepted
time: 231ms
memory: 37344kb
input:
99995 99995 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 ...
output:
99995 99993 99993 99993 99992 99991 99991 0 99991 99991 99991 99990 99990 99989 99989 99988 0 99987 ...
result:
ok 99995 tokens
Test #12:
score: 5
Accepted
time: 227ms
memory: 35452kb
input:
99995 99995 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 ...
output:
0 99994 99994 99994 99994 0 99993 99992 99992 99992 99992 99992 99992 99992 99991 99991 99990 99990 ...
result:
ok 99995 tokens
Test #13:
score: 5
Accepted
time: 218ms
memory: 38212kb
input:
99996 99996 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 ...
output:
0 0 1 0 1 15360 17790 1 1 0 17790 17790 1 0 1 0 17790 1 17790 1 15360 0 15360 0 1 17790 0 0 17790 1 ...
result:
ok 99996 tokens
Test #14:
score: 5
Accepted
time: 254ms
memory: 37720kb
input:
99996 99996 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 ...
output:
11359 0 0 0 15118 0 1 0 15118 0 11359 0 17680 0 1 17680 5 5 15118 0 17680 0 17680 0 1 0 15118 17680 ...
result:
ok 99996 tokens
Test #15:
score: 5
Accepted
time: 266ms
memory: 38132kb
input:
99996 99996 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 ...
output:
0 0 0 11475 17812 1 0 1 0 1 0 0 17812 0 0 17812 0 1 0 11475 0 0 1 0 0 17812 1 11475 1 0 17812 0 1147...
result:
ok 99996 tokens
Test #16:
score: 5
Accepted
time: 243ms
memory: 35652kb
input:
99996 99996 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 ...
output:
4 4 4 0 0 11444 4 15033 1 0 1 0 0 0 17389 17389 4 15033 0 4 15033 4 17389 0 11444 0 0 1 4 4 0 0 0 17...
result:
ok 99996 tokens
Test #17:
score: 5
Accepted
time: 348ms
memory: 50224kb
input:
99997 99997 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 ...
output:
0 0 0 6125 7913 9253 0 0 6125 0 6125 0 0 9253 0 7917 1 1 0 2 6125 1 6125 0 6125 0 0 7913 0 9253 0 0 ...
result:
ok 99997 tokens
Test #18:
score: 5
Accepted
time: 341ms
memory: 49912kb
input:
99997 99997 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 ...
output:
9034 7762 2 7 0 0 2 5721 0 5721 9033 2 0 5721 9033 9033 2 7763 2 0 9033 0 9033 0 5721 0 0 7763 0 0 0...
result:
ok 99997 tokens
Test #19:
score: 5
Accepted
time: 360ms
memory: 50256kb
input:
99997 99997 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 ...
output:
13821 5970 0 0 5970 7887 1 7887 5970 7885 7885 5970 9070 7885 7885 5970 0 1 5970 0 1 0 7885 2 7885 0...
result:
ok 99997 tokens
Test #20:
score: 5
Accepted
time: 1110ms
memory: 126468kb
input:
299998 299998 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 1...
output:
6 74 0 117 12 5 4 12 0 25 2 2 244 3 11 4 0 66 25 12 0 4 3 0 11 118 0 4 11 0 0 0 11 4 4 114 114 7 3 1...
result:
ok 299998 tokens