{ZJU}{2866}{Overstaffed Company}

-problem: 一棵树n<50000节点, 每个节点上有<1000000人, 问每个节点的子节点(可以是非直接)人数比自己多的节点数量.
solution: 树状数组(以人数为下标)+树形DP
----link: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1866
----code: http://docs.google.com/document/pub?id=1bFekAUqaPJBXzOvU3qDokRi2n83ggHbB0SFyrwlv2O4

注意遍历下一棵子树之前不用清空树状数组, 只需要计算两次sum, 然后用后一次的sum减去前一次的即可.
这里有个小技巧, 因为树状数组是维护一个数组的前缀和, 而本题要求的是大于某人数的节点总数, 所以输入的时候把每个节点的人数用>1e6减一下即可, >1e6是因为树状数组下标0处不可用.

Related posts

Comments 4

  1. saturn wrote at 2010-07-08 12:51

    谢谢了~还有ZOJ2865这是一个大数的运算,但是循环变量我搞不定。。。。

    还有ZOJ2961是一搜索题,麻烦你了。。。万分感谢~~ T T

  2. Answeror wrote at 2010-07-08 22:51

    2865没什么意思, 倒是2961看上去像个数学题, 是不是模线性方程组什么的…我不会…

  3. saturn wrote at 2010-07-14 15:33

    不好意思~请问一下结构体里面
    int l(int v)
    void inc(int i, int v)
    int sum(int i)
    三个函数的具体用处是什么?
    有点糊涂~呵呵。。。谢了~

  4. Answeror wrote at 2010-07-14 15:37

    结构体是binary index array, 即树状数组.
    l是lowbit, inc是对树状数组某元素的增减操作, sum是前缀和.

Post a Comment

Your email is never published nor shared. Required fields are marked *