Logo Wy Online Judge

WyOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#444#76. 「NOIP2016」天天爱跑步Pigsyy1005298ms126468kbC++233.1kb2025-04-24 13:39:062025-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