「JLOI2012」树

Posted zsbzsb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「JLOI2012」树相关的知识,希望对你有一定的参考价值。

「JLOI2012」树

传送门
不得不说这题的数据是真的水。。。
我们可以想到很明确的一条思路:枚举每一个点向根节点跳,知道路径和不小于 (s),恰好等于 (s) 就直接加答案。
跳的过程可以用倍增搞,但是暴力跳也可以过(这棵树的高度比较友好啊)
我只给了暴力的代码,倍增的懒得去写了。。。
参考代码:

/*--------------------------------
  Code name: B.cpp
  Author: The Ace Bee
  This code is made by The Ace Bee
--------------------------------*/
#include <cstdio>
#define rg register
#define file(x)                                     freopen(x".in", "r", stdin);                    freopen(x".out", "w", stdout);
const int $ = 100010;
inline int read() {
    int s = 0; bool f = false; char c = getchar();
    while (c < '0' || c > '9') f |= (c == '-'), c = getchar();
    while (c >= '0' && c <= '9') s = (s << 3) + (s << 1) + (c ^ 48), c = getchar();
    return f ? -s : s;
}
int n, s, val[$], fa[$];
inline int jump(int u) {
    int tmp = 0;
    for (; u && tmp < s; u = fa[u]) tmp += val[u];
    return tmp == s;
}
int main() {
//  file("B");
    n = read(), s = read();
    for (rg int i = 1; i <= n; ++i) val[i] = read();
    for (rg int u, v, i = 1; i <= n - 1; ++i)
        u = read(), v = read(), fa[v] = u;
    int ans = 0;
    for (rg int i = 1; i <= n; ++i) ans += jump(i);
    printf("%d
", ans);
    return 0;
}

以上是关于「JLOI2012」树的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 2783 [JLOI2012]树

BZOJ2783[JLOI2012]树 DFS+栈+队列

题解 P3252 [JLOI2012]树

洛谷 P3252 [JLOI2012]树

bzoj2783: [JLOI2012]树

[bzoj2783][JLOI2012]树_树的遍历